Qt 中,事件其实就是 QEvent 子类的一个实例,每个子类都表示某种类型的事件,每个事件都有一个关联的类型,在QEvent ::Type中定义,一些子类可以实际支持多种事件类型。例如,QMouseEvent 表示鼠标相关事件,相关事件类型有QEvent::MouseButtonDblClick,QEvent::MouseButtonPress,QEvent::MouseButtonRelease,QEvent::MouseMove等。
Qt 事件的处理方法:
- 重写虚函数 QObject::event(),该函数会处理传递过来的所有事件,可以在事件到达特定的事件处理器之前处理它们。若该函数返回 true,则表示该事件已被处理,不会再传递给父对象;若返回false,则会向父对象传递。
- 重写特殊的事件处理器。为了编程方便,event() 函数中将一些常用的事件分开给一些成员函数来处理。例如,窗口绘制事件paintEvent(),鼠标按下事件mousePressEvent(),鼠标释放事件 mouseReleaseEvent() 等,这些函数都是虚函数,可以通过重写这些虚函数,直接处理对应的事件,这是最常用的处理方法。
- 事件过滤器,详见下一章
注意,通过Qt 关于消息体制的文档可以知道,重写事件处理器时,如果只是拓展,必须调用基类对应的事件处理器,以保留对其他情况的默认处理。
为了说明事件的传递过程, 我们自定义一个MyWidget,继承自QWidget,鼠标点击时打印一些标识信息,实例化几个MyWidget,并依次嵌套,代码如下:
MyWidget::MyWidget(int index, QWidget *parent) :
QWidget(parent),
index(index)
{
}
void MyWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
QRect rect = this->rect();
re