QEvent 类是所有事件类的基类。事件对象包含事件参数。
Header: | #include <QEvent> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Inherited By: |
- 所有成员的列表,包括继承的成员
- QEvent 是 Event Classes的一部分
【详细描述】
★ Qt主事件循环(QCoreApplication::exec()) 从事件队列中获取本地窗口系统事件,将它们转换为QEvent,并将转换后的事件发送到各 QObject。
Qt中的事件会经过:派发 -> 过滤 -> 分发 -> 处理,4个阶段。
Qt对窗口中发生的事件有一系列的默认处理动作,用户可以在适当位置重写这些事件虚函数。
每个Qt应用程序都有一个唯一的QApplication应用程序对象,继承于QCoreApplication,调用它的exec()函数,便开启了Qt框架内部的事件循环机制。
int main(int argc,char* argv[])
{
QApplication a(argc,argv); //有且唯一的应用程序对象
MainWindow* w = new MainWindow;
w.show();
return a.exec(); //开启消息循环机制,进行事件的派发
}
Qt中产生事件后通过如下过程分发:
1.【派发】当事件产生后,通过QApplication应用程序对象调用重写的虚函数notify()将事件分发到指定的窗口:
//QObject *receiver 指向事件接收者,QEvent *e 指向产生的事件 [override virtual] bool QApplication::notify(QObject *receiver,QEvent *e)
2.【过滤】事件发送过程中,可以通过事件过滤器eventFilter()进行过滤,默认不过滤任何事件。
//QObject *watched指向要过滤事件的对象,QEvent *event指向要被过滤的事件 [virtual]bool QQbject::eventFilter(QObject *watched,QEvent *event)
3.【分发】未被过滤的事件会发送到指定的窗口,窗口的事件分发器event()会对收到的事件进行分类,并调用对应的事件处理器函数:
//QEvent *event指向应用程序派发且未被过滤的事件,分类后转给事件处理函数 [override virtual protected] bool QWidget::event(QEvent *event)
4.【处理】分类后的事件会交由对应的事件处理器函数,每个事件处理函数都有默认的处理动作,用户也可以重写这些事件处理函数,例如:
//鼠标按下 void QWidget::mousePressEvent(QMouseEvent *event) //鼠标释放 void QWidget::mouseReleaseEvent(QMouseEvent *event) //鼠标移动 void QWidget::mouseMoveEvent(QMouseEvent *event)
- 上述事件处理函数都是“回调”函数,其调用过程由Qt框架完成,无需程序员干预。
- 上述4个环节中事件处理器函数经常由程序员重写,以实现具体功能,它们主要分布在两个位置QObject类和QWidget类,前者只有一个timerEvent()定时器虚函数,后者有二十多个。
★ 通常,事件来自底层窗口系统 (系统事件,spontaneous() 返回真),但也可以使用 QCoreApplication::sendEvent()和QCoreApplication::postEvent() (应用程序内部事件,spontaneous() 返回假)。
★ QObjects 通过调用事件的 QObject::event() 函数来接收事件,该函数可以在子类中重新实现,以便自定义事件处理并添加其他事件类型。
★ QObjects 默认情况下,事件被调度给事件处理程序,如 QObject::timerEvent() 和 QWidget::mouseMoveEvent()。
★ QObject::installEventFilter() 允许一个对象截获发往另一个对象的事件。
★ QEvent 仅包含一个事件类型参数和一个“accept”标志,可以使用 accept() 设置或使用 ignore() 清除的 accept 标志。
accept 是默认设置的,但不要依赖它,因为子类可能会选择在其构造函数中清除它。
参阅 QObject::event(), QObject::installEventFilter(), QCoreApplication::sendEvent(), QCoreApplication::postEvent(), QCoreApplication::processEvents().
【公共类型】(枚举)
enum | Type { None, ActionAdded, ActionChanged, ActionRemoved, ActivationChange, …, MaxUser } | 该枚举类型定义了Qt中的有效事件,共140个左右。 |
【属性】
- accepted : bool
该属性保存事件对象的接受标志。
【公有函数】
QEvent(QEvent::Type type) | 构造type类型的事件对象。 | |
virtual | ~QEvent() | 析构。如果是 posted,它将从要发布的事件列表中删除。 |
void | accept() | 事件对象的 accept 标志。 |
virtual QEvent * | clone() const | 创建并返回此事件的相同副本。 |
void | ignore() | 清除事件对象的 accept 标志,等效于调用 setAccepted(false)。 清除 accept 参数表示事件接收器不需要该事件。不需要的事件可能会传递到父控件。 |
bool | isAccepted() const | 访问函数,查看accept 。 |
bool | isInputEvent() const | 如果事件对象是QInputEvent或者它的一个子类则返回true 。 |
bool | isPointerEvent() const | 如果事件对象是QSinglePointEvent则返回true 。 |
bool | isSinglePointEvent() const | 如果事件对象是QSinglePointEvent则返回true 。 |
virtual void | setAccepted(bool accepted) | 设置事件对象的 accept 标志,等效于调用 setAccepted(true)。 设置 accept 参数表示事件接收器需要该事件。不需要的事件可能会传递到父控件。 |
bool | spontaneous() const | 如果事件源自应用程序外部(系统事件),则返回真,否则返回假。 |
QEvent::Type | type() const | 返回事件类型。 |
【静态公有成员】
int | registerEventType(int hint = -1) | 注册并返回自定义事件类型。如果 hint 提供的值可用,则使用它,否则它将返回一个 QEvent::User 和 QEvent::MaxUser 之间(1000-65535)尚未注册的值。如果 hint 的值不在 QEvent::User 和 QEvent::MaxUser之间,则忽略 。 如果所有可用值都被占用或程序正在关闭,则返回 -1。 |