借助c++ 代码来理解 eventFilter
在许多不同的情况下,您可以使用回车键,例如,开始搜索操作。
Qt允许重新实现一般事件捕获方法。你需要一个新类,其方法如下:
bool eventFilter (QObject * obj , QEvent * event );
例如:
class keyEnterReceiver : public QObject
{
Q_OBJECT
protected :
bool eventFilter (QObject * obj , QEvent * event );
};
现在实现该方法:
bool keyEnterReceiver :: eventFilter (QObject * obj , QEvent * event )
{
if (event - > type ()== QEvent :: KeyPress ) {
QKeyEvent * key = static_cast < QKeyEvent *> (event );
if ( (key - > key ()== Qt :: Key_Enter ) || (key- > key ()== Qt :: Key_Return ) ) {
//按下Enter或return
} else {
return QObject :: eventFilter (obj , event );
}
return true ;
} else {
return QObject :: eventFilter (obj , event );
}
return false ;
}
按键?
首先,我们检查是否按下了任何键。如果没有,这是一个与回车无关的事件 - 并且Qt应该处理它:
bool keyEnterReceiver :: eventFilter (QObject * obj , QEvent * event )
{
if (event - > type ()== QEvent :: KeyPress ) {
...
} else {
return QObject :: eventFilter (obj , event );
}
return false ;
}
我们得到了一个QEvent作为参数。要读出按下了哪个键,我们需要将QEvent转换为QKeyEvent:
QKeyEvent * key = static_cast < QKeyEvent *> (event );
输入/返回或其他键?
而已。现在我们只需要检查它是“我们的”输入键还是我们不感兴趣的另一个键:
if ( (key - > key ()== Qt :: Key_Enter ) || (key - > key ()== Qt :: Key_Return ) ) {
//按下Enter或return
} else {
return QObject :: eventFilter (obj , event );
}
return true ;
最后,我们可以安装事件处理程序: keyEnterReceiver* key = new keyEnterReceiver();
aWidgetInAnotherClass->installEventFilter(key);
这里面 能说明 被监控控件 与 安装者 的关系 。