目录
事件系统(The Event System)
在Qt中,事件是从抽象QEvent类派生出来的对象,表示应用程序内部或应用程序需要了解的外部活动的结果所发生的事情。事件可以由QObject子类的任何实例接收和处理,但它们与小部件特别相关。本文档描述了在典型应用程序中如何传递和处理事件。
事件是如何传递的(How Events are Delivered)
当事件发生时,Qt通过构造适当的QEvent子类的实例来创建一个事件对象来表示它,并通过调用其event()函数将其传递给QObject的特定实例(或其子类之一)。此函数不处理事件本身;根据所传递的事件类型,它为该特定类型的事件调用事件处理程序,并根据事件是被接受还是被忽略来发送响应。
一些事件,如QMouseEvent和QKeyEvent,来自窗口系统;有些,如QTimerEvent,来自其他来源;有些来自应用程序本身。
事件类型(Event Types)
大多数事件类型都有特殊的类,特别是QResizeEvent、QPaintEvent、QMouseEvent,QKeyEvent和QCloseEvent。每个类都子类化QEvent并添加特定于事件的函数。例如,QResizeEvent添加了size()和oldSize(),使小部件能够发现其尺寸是如何更改的。
有些类支持多个实际事件类型。QMouseEvent支持鼠标按钮按下、双击、移动和其他相关操作。
每个事件都有一个在QEvent::Type中定义的关联类型,这可以作为运行时类型信息的方便来源,以快速确定给定事件对象是从哪个子类构造的。
由于项目需要以多种复杂的方式做出反应,Qt的事件交付机制非常灵活。QCoreApplication::notify()的文档简明扼要地讲述了整个故事;《Qt季刊》的文章《Another Look at Events》则不那么简洁地重复了它。在这里,我们将对95%的应用程序进行足够的解释。
事件处理器(Event Handlers)
传递事件的正常方式是调用虚函数。例如,通过调用QWidget::paintEvent()来传递QPaintEvent。这个虚功能负责做出适当的反应,通常通过重新绘制小部件。如果在虚函数的实现中没有执行所有必要的工作,则可能需要调用基类的实现。
例如,以下代码处理自定义复选框小部件上的鼠标左键单击,同时将所有其他按钮单击传递给基类QCheckBox:
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);
}
}
如果要替换基类的函数,则必须自己实现所有内容。然而,如果你只想扩展基类的功能,那么你可以实现你想要的,并调用基类来获得你不想处理的任何情况的默认行为。
有时,没有这样一个特定于事件的功能,或者特定于事件功能不够。最常见的例子是按Tab键。通常,QWidget会截取这些内容以移动键盘焦点,但一些小部件本身需要Tab键。
这些对象可以重新实现常规事件处理程序QObject::event(),并在常规处理之前或之后进行事件处理,或者可以完全替换函数。一个既解释Tab又具有特定于应用程序的自定义事件的非常不寻常的小部件可能包含以下event()函数:
bool MyWidget::event(QEvent *event) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *ke = sta
Qt事件系统详解

最低0.47元/天 解锁文章
3195

被折叠的 条评论
为什么被折叠?



