在Qt里,事件都是派生自QEvent类,它表示在应用程序内部发生的事情,如定时器事件,或者作为应用程序需要了解的外部活动的结果。比如鼠标点击,键盘输入,等:QResizeEvent, QPaintEvent, QMouseEvent, QKeyEvent, 和 QCloseEvent等。事件可以由QObject子类的任何实例接收和处理,但与widget尤其相关。本文档描述如何在典型应用程序中传递和处理事件
事件是怎样传递的
当事件发生时,Qt通过构造相应的QEvent子类的实例来创建一个事件对象来表示它,并通过调用其event()函数将其传递给QObject的特定实例(或其子类之一)。
(比如鼠标点击事件,当在widget内按下或释放鼠标按钮,或移动鼠标光标时,会发生鼠标事件。鼠标事件包含一个特殊的接受标志,指示接收者是否需要该事件。如果小部件未处理鼠标事件,则应调用ignore()。鼠标事件在父窗口小部件链上传播,直到窗口小部件用accept()接受它,或者事件筛选器使用它。)
这个函数本身不处理事件;根据所交付的事件类型,它调用特定类型事件的事件处理程序,并根据事件是被接受还是被忽略来发送响应。
一些事件,如QMouseEvent和QKeyEvent,来自窗口系统;如QTimerEvent,来自其他来源;有些来自应用程序本身。
事件类型
大多数事件类型都有特殊的类,如:QResizeEvent、QPaintEvent、QMouseEvent、QKeyEvent和QCloseEvent。每个类都将QEvent子类化并添加特定于事件的函数。例如,QResizeEvent添加size()和oldSize(),以使小部件能够发现其维度是如何更改的。
有些类支持多个实际事件类型。QMouseEvent支持鼠标按键、双击、移动和其他相关操作。
每个事件都有一个关联的类型,在QEvent::type中定义,这可以作为运行时类型信息的方便来源,用于快速确定从哪个子类构造给定的事件对象。
由于程序需要以各种复杂的方式作出反应,Qt的事件传递机制是灵活的 QCoreApplication::notify() 函数实现了事件的传递,基本看完这个函数就了解事件的传递机制了。
事件的处理
传递事件的正常方式是调用虚函数。例如,QPaintEvent是通过调用QWidget::paintEvent()来传递的。这个虚函数负责做出适当的反应,通常是重新绘制widget。如果在虚函数的实现中没有执行所有必要的工作,则可能需要调用基类的实现。
如以下代码处理在自定义checkbox小部件上的鼠标左键单击,同时将所有其他按钮单击传递给基础QCheckBox类:
void MyCheckBox::mousePressEvent(QMouseEvent *event)
{
if (event->button()