QEvent 理论总结
- 一、概述
- 二、事件类型
- 1. Qt 已定义类型
- 2. 开放用户定义类型
- 三、注册事件
一、概述
Qt的主事件循环(QCoreApplication::exec())从事件队列中获取原生窗口系统事件,将它们转换为QEvents,并将转换后的事件发送给QObjects。
一般来说,事件来自底层的窗口系统 (spontaneous()返回true),但也可以使用 QCoreApplication::sendEvent()和QCoreApplication::postEvent() 手动发送事件(spontaneous()返回false)。
QObject对象通过调用其QObject::event()函数来接收事件。该函数可以在子类中重新实现,以自定义事件处理并添加其他事件类型。在Qt几乎所有的窗口类都是继承了 QObject ,所以我们可以重载 event() 函数去拦截消息。
QWidget::event()就是一个显著的例子。默认情况下,事件被分派给QObject::timerEvent()和 Widget::mouseMoveEvent()这样的事件处理程序。QObject::installEventFilter()允许一个对象拦截发送给另一个对象的事件。
基本的QEvent只包含一个事件类型参数和一个 “accept” 标志。我们可以使用 accept() 设置accept标志,并使用 ignore() 清除。它是默认设置的,但不要依赖它,因为子类可能会选择在其构造函数中清除它。
QEvent 是所有事件类的基类,这个类主要就是维护一个事件的类型,注册事件类型。
二、事件类型
Qt 中 QEvent 维护着事件的基本属性,其中的事件类型是一个枚举值:
QEvent 也提供了 基础的已经预定义好的事件类型,以及开放出来给用户使用的事件类型。
其实就很像 Windows 消息 一样,也是提供自己定义的消息。
1. Qt 已定义类型
这个枚举类型定义了Qt中有效的事件类型。事件类型和每个类型的专用类如下所示:
…
非常多,需要查看对应的帮助文档,这个不需要记住,只要会查到怎么使用就好。
2. 开放用户定义类型
用户事件的值应该在User和MaxUser之间:
事件类型 | 值 | 含义 |
---|---|---|
QEvent::User | 1000 | 用户定义的事件的最小值。 |
QEvent:MaxUser | 65535 | 最后一次用户事件ID。 |
为了方便,可以使用 registerEventType() 函数为应用程序注册和保留一个自定义事件类型。这个函数也是静态的,所有用的时候就在全局变量使用的时候注册一个自己要使用的类型就好啦。
这样做可以避免意外重复使用已经在应用程序中其他地方使用的自定义事件类型。
三、注册事件
- int QEvent::registerEventType(int hint = -1)
这个hint其实就是我们可以预传入的一个事件值,具体的解释如下:
这个函数注册并返回一个自定义事件类型。如果提供的 hint 可用,将使用它,否则它将返回一个介于QEvent::User和QEvent::MaxUser之间的尚未注册的值。如果它的值不在QEvent::User和QEvent::MaxUser之间,则忽略提示 hint 。
如果所有可用值都已被获取,或程序正在关闭,则返回-1。
- 注意:这个函数是线程安全的。