[Q学习]10 Qt事件系统——处理事件
来源:互联网 发布:java 双引号 加斜杠 编辑:程序博客网 时间:2024/05/30 07:12
原创文章,可以转载,转载时请以超链接形式保留本文地址、作者信息和本声明。否则将追究法律责任。
上一篇说了如何想QObject类对象投递事件,本篇则要说说接收对象如何处理事件。
先看来自于QWidget的例子,从QWidget声明文件中截取一段代码:
protected: // Event handlers virtual void mousePressEvent(QMouseEvent *); virtual void mouseReleaseEvent(QMouseEvent *); virtual void mouseDoubleClickEvent(QMouseEvent *); virtual void mouseMoveEvent(QMouseEvent *); virtual void keyPressEvent(QKeyEvent *); virtual void keyReleaseEvent(QKeyEvent *); virtual void focusInEvent(QFocusEvent *); virtual void focusOutEvent(QFocusEvent *); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); virtual void paintEvent(QPaintEvent *); virtual void moveEvent(QMoveEvent *); virtual void resizeEvent(QResizeEvent *); virtual void closeEvent(QCloseEvent *);
大家能看出什么?上述接口都是事件处理函数,他们共同的特点都是——虚函数。Qt的事件处理流程是按照类的继承层次,从基类一直找到最后重载的接口完成最终的处理过程。
比如,我们要做一个特殊的鼠标按键处理,则需要重载接口:
virtual void mousePressEvent(QMouseEvent *);
下面的代码来自于Qt助手。
void MyCheckBox::mousePressEvent(QMouseEvent *event){ if (event->button() == Qt::LeftButton) { // handle left mouse button here } else { // pass on other buttons to base class QCheckBox::mousePressEvent(event); }}
更进一步,如果我们要处理的事件比较复杂,重载单一的接口无法满足要求,那我们可以重载事件处理的入口:QObject::event(),它是QObject最一般性的事件处理函数,所有的事件都会通过该接口进行传递,通过重载QObject::event()接口,我们能够获得该类完全的事件处理权,但是要注意,该接口功能强大,如果不小心会截断所有的事件处理过程,所以重载该接口最后会调用QWidget::event(event);将未处理的事件继续传递下去直至事件被处理。
bool MyWidget::event(QEvent *event){ if (event->type() == QEvent::KeyPress) { QKeyEvent *ke = static_cast<QKeyEvent *>(event); if (ke->key() == Qt::Key_Tab) { // special tab handling here return true; } } else { if (event->type() == MyCustomEventType) { MyCustomEvent *myEvent = static_cast<MyCustomEvent *>(event); // custom event handling here return true; } } return QWidget::event(event);}
QObject::event()返回true,则事件完成处理。
总结一下:
1 Qt处理事件通过QObject的虚函数完成,用户通过重载虚函数完成自定义的处理;
2 QObject::event()可以对所有事件进行处理,功能强大,使用要小心谨慎。
0 0
- [Q学习]10 Qt事件系统——处理事件
- [Q学习]9 Qt事件系统——投递事件
- [Q学习]11 Qt事件系统——过滤事件
- [Q学习]12 Qt事件系统——发送事件
- Qt学习笔记——事件处理
- Qt事件处理(二)——事件处理链
- Qt学习笔记:事件系统
- Qt事件处理(三)——事件过滤器
- QT——事件处理机制
- Qt事件处理(五)——定时器
- Qt学习之路——— Qt键盘、鼠标事件的处理
- Qt事件处理-事件过滤器
- Qt事件处理-事件过滤器
- QT开发(十二)——QT事件处理机制
- Qt学习笔记(六) 事件处理
- Qt学习笔记(三)事件处理
- QT学习之事件处理(一)
- js学习笔记:事件——事件流、事件处理程序、事件对象
- Intent之学习二(Activity间数据的传递)
- POJ 1185 炮兵阵地(状态压缩dp)
- spring在web容器启动时执行初始化方法
- jsp
- 51nod循环数组最大子段和
- [Q学习]10 Qt事件系统——处理事件
- 俯视SpringMvc
- 矩形嵌套
- Gym-100712C-Street Lamps
- tigase
- Node.js入门——mac下安装Node.js
- Exercise(20):蛇形填数
- poj 1754 I Hate It --线段树(单点更新,区间求最大值)
- Unity3d Shader光照模型