Qt / Qt5 事件(event)机制详解
一、简述
事件主要分为两种:
- 在与用户交互时发生。比如按下鼠标(mousePressEvent),敲击键盘(keyPressEvent)等。
- 系统自动发生,比如计时器事件(timerEvent)等。
在发生事件时(比如说上面说的按下鼠标),就会产生一个 QEvent 对象(这里是QMouseEvent,为 QEvent 的子类),这个 QEvent 对象会按照下图所示的流程进行传递:

源码部分如下:
二、事件过滤器
本质上是其他对象插入到当前对象中的间谍,该间谍专门捕获传入到当前对象的 QEvent 对象,发现该 QEvent 符合该间谍的任务要求,则进行处理,申请直接截获该 QEvent 对象,不给当前对象使用。

主对话框拦截向 TextEdit 输入的字符。
#ifndef WIDGET_H
#define WIDGET_H#include
#include class Widget : public QWidget
{
public:Widget();protected:virtual bool eventFilter(QObject *obj, QEvent *event) override;private:QTextEdit *textEdit;
};#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"#include
#include
#include Widget::Widget()
{textEdit = new QTextEdit(this);textEdit->setGeometry(30, 30, 300, 30);textEdit->installEventFilter(this);move(30, 30);
}bool Widget::eventFilter(QObject *obj, QEvent *event)
{if (obj == textEdit){if (event->type() == QEvent::KeyPress){QKeyEvent *keyEvent = static_cast(event);std::cout << "iostream you press " << keyEvent->key() << std::endl;//事件不再进行传播,拦截return true;}elsereturn false; //继续传播}else{//当不确定是否继续传播时,按照父类的方法来处理//即调用父类的evenFilter函数return QWidget::eventFilter(obj, event);}
}
三、事件分发器
函数原型:
virtual bool event(QEvent *e)
返回 true,表明该事件本函数已经处理完了,不用劳烦老爹处理了。
返回 false,表明该事件关我 PI 事,还是交给老爹处理吧。
如果想要老爹处理需要沟通一下,语言如下:
return QWidget::event(e);
老爹的操作就是将该事件根据类型的不同分配到不同是事件分发器中。
四、事件处理
不同的事件对象有不同的处理函数,例如鼠标抬起事件,其专用处理函数为:
virtual void mousePressEvent(QEvent *);
五、小结

(SAW:Game Over!)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
