這可能有點兒糊塗,但是不能只是在中央小部件上安裝事件過濾器並查找您感興趣的按鍵嗎?
下面的代碼,我似乎做你的描述,如果按CTRL+X
它啓動一個計時器,在其超時()將觸發對QTextEdit
一個cut()
事件(這是QMainWindow
的centralWidget()
)。如果另一個關鍵事件帶有CTRL+C
而CTRL+X
標誌仍處於活動狀態,則會觸發close()
。
mainwindow.h
#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
#include <QMainWindow>
#include "ui_mainwindow.h"
#include <QTimer>
class MainWindow: public QMainWindow, private Ui::MainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
virtual bool eventFilter(QObject *obj, QEvent *event);
public slots:
void passOnEvent();
private:
QTimer *timer;
bool xactive;
};
#endif
mainwindow.cc
#include "mainwindow.h"
#include <QMouseEvent>
#include <QKeyEvent>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer (new QTimer), xactive(false)
{
setupUi(this);
centralWidget()->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(obj != centralWidget()) {
return QObject::eventFilter(obj, event);
} else if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_X && keyEvent->modifiers() == Qt::ControlModifier) {
timer->start(250);
connect(timer,SIGNAL(timeout()),this,SLOT(passOnEvent()));
xactive = true;
return true;
} else if(xactive && keyEvent->key() == Qt::Key_C && keyEvent->modifiers() == Qt::ControlModifier) {
this->close();
return true;
} else {
return QObject::eventFilter(obj, event);
}
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
}
void MainWindow::passOnEvent()
{
xactive = false;
timer->stop();
static_cast<QTextEdit*>(centralWidget())->cut();
}
儘管此代碼對我的作品,可能有事情它與你在做其他事情干擾。此外,我沒有解決您對QKeySequence
和activatedAmbigiously()
的任何問題。
讓我知道這是否有幫助。
你可以告訴哪個小部件最終吞嚥事件嗎? – MrFox
我認爲這是QTextEdit,因爲它試圖運行切割動作。 – Milen
因此,按下Ctrl + X時,您不希望QTextEdit執行剪切操作?或者你想讓它做切割,但也有主窗口接收按鍵? –