Qt事件系统概述event system

本文详细介绍了Qt的事件系统,包括事件的传递、处理、过滤和发送。事件由QEvent子类表示,通过QCoreApplication::notify()进行传递。事件处理涉及特定的事件处理函数,如QPaintEvent的paintEvent()。事件过滤允许对象拦截其他对象的事件,而sendEvent()和postEvent()用于创建和发送自定义事件。自定义事件需要定义事件编号并可能扩展QEvent。
摘要由CSDN通过智能技术生成

在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() 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值