# 借助c++ 代码来理解 eventFilter

借助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);这里面 能说明 被监控控件 与 安装者 的关系 。

猜你喜欢

转载自blog.csdn.net/m0_37329910/article/details/88089582