这可能有点胡扯,但您不能简单地在中央小部件上安装一个事件过滤器并查找您感兴趣的按键吗?
对我来说,下面的代码似乎符合您的描述,如果您按下CTRL+X
它会启动一个计时器,该计时器会在其 timeout() 上触发一个cut()
事件QTextEdit
(这是centralWidget()
的QMainWindow
)。CTRL+C
相反,如果在标志仍然处于活动状态时出现另一个键事件CTRL+X
,它将触发close()
.
主窗口.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
主窗口.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
and的任何问题activatedAmbigiously()
。
让我知道这是否有帮助。