Qt写应用,常见的需求是控件不是当前焦点的时候,也需要侦测按键、鼠标事件。这种需求只要使用eventFilter即可。
1、Widget头文件中,加入
protected: bool eventFilter(QObject *obj, QEvent *event);
2、Widget构造中,写上
qApp->installEventFilter(this);
注意,这里的qApp可以看做全局变量,实际上是个宏,在qcoreapplication.h中:
#define qApp QCoreApplication::instance()
这里使用qApp的原因是只要应用是焦点,那么该Widget就能得到事件,不管层级、不管控件自身是否有焦点。
3、具体的过滤方法大致样子
bool TextExplorer::eventFilter(QObject *obj, QEvent *e) { if (e->type() == QEvent::KeyPress) { QKeyEvent* event = (QKeyEvent*) e; if (event->key() == Qt::Key_Right) { } else if(event->key() == Qt::Key_Left) { } } }