Qt 事件处理机制 (一):事件处理器

本文介绍了Qt中事件处理的机制,包括重写`QObject::event()`、特殊事件处理器和事件过滤器。通过示例代码展示了事件如何从子对象传递到父对象,并探讨了`QEvent::accept()`和`QEvent::ignore()`在事件传递中的作用。文章最后提出了一个关于同时重写`event()`和处理特定事件类型时的事件传递问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt 中,事件其实就是 QEvent 子类的一个实例,每个子类都表示某种类型的事件,每个事件都有一个关联的类型,在QEvent ::Type中定义,一些子类可以实际支持多种事件类型。例如,QMouseEvent 表示鼠标相关事件,相关事件类型有QEvent::MouseButtonDblClick,QEvent::MouseButtonPress,QEvent::MouseButtonRelease,QEvent::MouseMove等。

Qt 事件的处理方法:

  1. 重写虚函数 QObject::event(),该函数会处理传递过来的所有事件,可以在事件到达特定的事件处理器之前处理它们。若该函数返回 true,则表示该事件已被处理,不会再传递给父对象;若返回false,则会向父对象传递。
  2. 重写特殊的事件处理器。为了编程方便,event() 函数中将一些常用的事件分开给一些成员函数来处理。例如,窗口绘制事件paintEvent(),鼠标按下事件mousePressEvent(),鼠标释放事件 mouseReleaseEvent() 等,这些函数都是虚函数,可以通过重写这些虚函数,直接处理对应的事件,这是最常用的处理方法。
  3. 事件过滤器,详见下一章

注意,通过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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值