一个事件过滤器(filterObj)是一个接受所有发往这个对象的事件。这个事件过滤器(filterObj)既可以停止这个事件,也可以把事件传播到这个对象中。事件过滤器通过eventFilter() 函数接受事件,eventFilter() 必须返回true,如果这个事件被过滤掉了(比如,终止了),否则返回false.如果有多个事件过滤器被安装到了一个单易的对象中,最后一个过滤器会被首先激活。
这是一个 KeyPressEater 类:
class KeyPressEater : public QObject
{
Q_OBJECT
...
protected:
bool eventFilter(QObject *obj, QEvent *event);
};
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);
⚠:如果你删除接受对象中的 eventFilter() 函数, 请确保他返回true,否则, Qt 会如果向接受者中继续传播事件,就可能引起崩溃。
请注意过滤器对象必须在同一个线程中.如果不在同一个线程中就会失败.