installEventFilter函数如下:
void QObject::installEventFilter(QObject *filterObj)
Qt助手的解释如下:
在对象上安装一个事件过滤器filterObj。如下:
monitoredObj->installEventFilter(filterObj);
其中monitoredObj、filterObj都是QObject的子类。上面代码意思是:在monitoredObj对象上安装一个事件过滤器filterObj。该函数一般和如下函数配合使用:
[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)
注意:该函数是虚函数,也就是说派生自QObject的子类可以重写该函数。
上面monitoredObj对象安装一个filterObj过滤器后,则可以在filterObj对象所在类的eventFilter函数中拦截发送到monitoredObj对象所在类的事件。如下为KeyPressEater类:
class KeyPressEater : public QObject
{
Q_OBJECT
...
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
};
bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
qDebug("Ate key press %d", keyEvent->key());
return true;
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
}
现在我们在两个窗体部件上安装过滤器,如下:
KeyPressEater *keyPressEater = new KeyPressEater(this);
QPushButton *pushButton = new QPushButton(this);
QListView *listView = new QListView(this);
pushButton->installEventFilter(keyPressEater);
listView->installEventFilter(keyPressEater);
此时如果在按钮或QListView获取到键盘焦点且按下Esc键,按键事件被 KeyPressEater类的eventFilter函数拦截,从而弹出:
Ate key press 1048576
其中1048576为Esc键的虚拟键码。
注意: