QEvent是Qt中所有事件的基类,事件对象包含了该次事件所携带的相关参数。其成员函数如下:
QEvent(Type type)
virtual ~QEvent()
void accept()
void ignore()
bool isAccepted() const
void setAccepted(bool accepted)
bool spontaneous() const
Type type() const
其中,我们在开发中经常用到的就是accept() 和 ignore()函数。当然,accept() 等价于setAccepted(true),ignore() 等价于setAccepted(false)。
accept()设置accept标志,表明事件接收者想要处理这个事件,不要传递给其父窗口。
ignore() 于此相反,清除accept标志,即表明事件接收者不想处理该事件,请将事件继续往父窗口传递。
在一前将QCoreApplication类时,我们也提到过,Qt的主事件循环从本地窗口系统中获取事件,然后把他们转换成QEvent对象,再把它们发送给具体的事件接收者。通常情况下,事件都来自于底层窗口系统,但我们也可以手动的发送一个事件通过QCoreApplication::sendEvent() 和 QCoreApplication::postEvent() 函数。另外,可以使用QEvent的成员函数spontaneous() 来判断一个事件是不是手动发出的。
QObject通过调用event() 函数来响应事件。该函数可以被子类重写来自定义事件处理方式,也可以借此处理自定义的事件类型。默认情况下,Qt的事件系统会直接把事件分发给事件接受者的具体的事件处理器,比如QObject::timerEvent()、QWidget::mouseMoveEvent()等。但可以使用QObject::installEventFilter() 函数通过事件过滤器来让一个对象拦截另一个对象的事件。
QEvent类本身只包含一个事件类型的成员和一个"accept"标志。accept标志可以通过accept() 函数进行设置,使用ignore() 函数进行清除设置。默认情况下是被设置的,即accept为true。但我们不能依赖这个默认值,因为子类随时都有可能清除这个值。而Type在QEvent中是一个枚举类型,列出了当前Qt事件系统所支持的所有事件类型。除此之外,我们还可以自定义自己的事件类型,但要确保自定义的事件类型在Qt所要求的范围内,即QEvent::User~QEvent::MaxUser,且在整个应用程序中是唯一的,为了确保这一点,可以在自定义事件类型时,使用QEvent的静态成员函数registerEventType() 让Qt系统为我们选择一个当前合法且唯一的事件类型值。
下面,我们就来实现一个简单的自定义事件:
打开QtCreator,新建一个GUI程序,选择QWidget作为我们窗口的基类。
我们先在