QT事件处理(二) 之 事件过滤器
来源:互联网 发布:淘宝客关键词转换 编辑:程序博客网 时间:2024/04/20 04:46
如果对象安装了事件过滤器,则事件在到达目标对象之前先被事件过滤器截获,进行一些处理之后再交给目标对象,该模式总结为一个图如下:
注意:这里需要区别对待,如果你是使用installEventFilter()函数给目标对象注册事件过滤器,那么该事件过滤器只对该目标对象有效,只有该对象的事件需要先传递给eventFilter()函数进行过滤,然后调用相应的事件处理器进行处理,非目标对象则不受影响。如果你是给程序中唯一的QApplication对象注册事件过滤器,那么该过滤器对程序中的每一个对象都有效,任何对象的事件都是先传给eventFilter()函数,然后再使用事件处理器进行处理。
一个事件过滤器的安装需要下面2个步骤:
1, 调用installEventFilter()注册需要管理的对象。
2,在eventFilter() 里处理需要管理的对象的事件。
《C++ GUI QT 4》上的一个例子:
让CustomerInfoDialog调用installEventFilter()去管理他的子部件的按键事件,在eventFilter() 里实现要求的行为
一般,推荐在CustomerInfoDialog的构造函数中注册被管理的对象。像下面这样:
CustomerInfoDialog::CustomerInfoDialog(QWidget *parent) : QDialog(parent){ ...
firstNameEdit->installEventFilter(this);
lastNameEdit->installEventFilter(this);
cityEdit->installEventFilter(this);
phoneNumberEdit->installEventFilter(this);
}
一旦,事件管理器被注册,发送到firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit的事件将首先发送到eventFilter()。
下面是一个 eventFilter()函数的实现:
bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)
{
if (target == firstNameEdit || target == lastNameEdit
|| target == cityEdit || target == phoneNumberEdit) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_Space) {
focusNextChild();
return true;
}
}
}
return QDialog::eventFilter(target, event);
}
在上面的函数中,我们首先检查目标部件是否是 firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit。接着,我们判断事件是否是按键事件。如果事件是按键事件,我们把事件转换为QKeyEvent。接着,我们判断是否按下了空格键,如果是,我们调用focusNextChild(),把焦点传递给下一个控件。然后,返回,true通知Qt,我们已经处理了该事件。
如果返回false的话,Qt继续将该事件发送给目标控件,结果是一个空格被插入到QLineEdit中。
如果目标控件不是 QLineEdit,或者按键不是空格键,我们将把事件传递给基类的eventFilter()函数。
- QT事件处理(二) 之 事件过滤器
- QT事件处理(二) 之 事件过滤器
- Qt事件处理-事件过滤器
- Qt事件处理-事件过滤器
- QT之事件过滤器
- Qt事件处理(二)
- QT学习 之 事件与事件过滤器
- Qt之Tab键实现(自由切换焦点)—— 采用事件过滤器处理
- 3.QT事件处理,消息过滤器
- Qt之事件过滤器 截获消息通知 自定义消息处理事件解析.
- QT类 Qevent事件处理过程 事件过滤器
- qt焦点事件响应捕捉处理,事件过滤器
- QT类 Qevent事件处理过程 事件过滤器
- Qt 事件处理和事件过滤器的返回值总结
- Qt事件处理(三)——事件过滤器
- Qt 学习之路 2(21):事件过滤器
- Qt学习之路(22): 事件过滤器
- Qt学习之路(22): 事件过滤器
- Linux命令学习手册-crontab命令
- 分解链表
- Java小程序:十进制转二进制
- python中的条件和循环
- Property Animation要点总结
- QT事件处理(二) 之 事件过滤器
- 看90后开发的游戏如何闯进AppStore前十
- [Erlang 0100] make_ref 与 Selective Receive
- 高性能、高流量Java Web站点打造的22条建议
- Block的学习记录
- 陈雨
- 三星nt7100升级android4.3系统导致adb offline问题
- Putty连接虚拟机
- Centos安装Apache Mysql Php