蓉华教育嵌入式开发系列:[5] QT的事件处理
作者:蓉华教育
2025-03-03
126次阅读
事件是用户和应用软件间产生的一个交互操作,由用户操作产生或者系统内部产生,通过事件循环对事件进行处理,事件也可以用来在对象间进行信息交互。
Qt平台会将系统产生的消息转换为Qt事件
Qt事件是一个QEvent的对象
Qt事件用来描述程序内部或外部发生的动作·任意的QObject对象都具备事件处理的能力
常见的事件如下:
键盘事件:按键按下或松开
鼠标事件:鼠标移动。鼠标按键的按下和松开
拖放事件:用鼠标进行拖放
滚轮事件:鼠标滚轮滚动
绘屏事件:重绘屏幕的某些部分
定时事件:定时器时间到达
大小改变事件:widget的大小改变
一、事件处理
Qt的主事件循环(QCoreApplication::exec())从事件队列中获取本机窗口系统事件,将它们转换为QEvents,并将转换后的事件发送到QObject
具体流程如下:
应用程序开始时(运行main()),会创建一个事件循环实例,通常是通过QCoreApplication或QApplication的exec()函数来启动事件循环。事件循环开始监听事件队列
事件可以由用户输入(如鼠标点击、键盘按键)或系统事件(如定时器事件、窗口事件)产生。事件首先被封装成QEvent类的一个实例,或者其子类,如QMouseEvent、QKeyEvent等。一旦事件被创建,它会被加入到Qt的事件队列中。
当有事件到达时,事件循环从队列中取出事件,根据事件的类型,将其分发给适当的目标对象。
QObject通过调用QObject::event()函数来接收事件。该函数可以在子类中重新实现,以自定义事件处理并添加其他事件类型;QWidget::event()就是一个值得注意的例子。默认情况下,事件被分派到事件处理程序.
重写事件处理函数,写一个类继承控件类
安装事件过滤器
事件过滤器可以对其他组件接收到的事件进行监控,任意的QObject对象都可以作为事件过滤器使用。
事件过滤器对象需要重写eventFilter()函数
事件过滤器在组件之前接收到事件
事件过滤器能够决定是否将事件转到组件对象
在Qt中,事件过滤是一种机制,允许一个对象(称为事件过滤器)监听并处理原本发往另一个对象(称为目标对象)的事件。事件过滤提供了在事件被目标对象处理之前对其进行检查和潜在修改的能力。
事件过滤的意义在于提供了一种更高级别的事件控制手段。例如,你可以使用事件过滤器来:
拦截事件:阻止某些事件被传递给目标对象,比如阻止鼠标点击事件导致窗口关闭。
预处理事件:在事件到达目标对象之前做一些预处理工作,例如改变事件的参数,或者根据条件决定是否应该让事件继续传递。
增强事件处理:在目标对象处理事件之前或之后添加额外的行为,例如记录日志、执行安全检查等。
二、事件vs信号
信号由具体的对象发出,然后马上交给由connect()函数链接的槽进行处理;而对于事件,Qt使用一个事件队列对所有发出的事件进行维护,当新的事件产生的时候,会追加到事件队列部。
信号一旦发出,对应关联的槽函数一定会被执行。但是事件则可以使用"事件过滤器"进行过滤,对于有些事件进行额外的处理。另外的事件则不关心。
事件是有操作系统或者程序内部产生,由具体的对象处理。
信号由对象产生,由对象的槽函数来执行。系统默认做事件处理时,一般都要更加事件类型发送对应的信号。进而触发槽函数的调用。
三、QEventLoop
QEventLoop是Qt框架中的一个核心组件,用于实现局部或临时的事件循环。在Qt中,主要的事件循环是由QCoreApplication或QGuiApplication提供的,它贯穿整个应用程序的生命周期。然而,有时候在某些特定的代码段中,你可能需要暂时停止代码的执行,等待某些事件发生,同时保持应用程序的其余部分响应用户输入和其他事件。这时,QEventLoop就派上了用场。
QEventLoop的一些主要用途:
等待异步操作完成: 当你需要等待一个耗时的异步操作(如网络请求、文件I/O)完成,而又不想阻塞整个应用程序时,可以使用QEventLoop。你可以在事件循环中等待特定的信号或条件变量被触发,从而知道异步操作已经完成。
防止界面卡死: 在GUI应用中,长时间运行的计算或等待操作会导致界面无响应,使用QEventLoop可以在执行这些操作的同时,仍然允许界面接收和处理事件,避免用户界面的卡顿。
模态对话框: 模态对话框通常需要阻止用户与主窗口的交互,直到对话框关闭。QEventLoop可以用于实现这种阻塞行为,同时仍然允许系统处理其他非用户输入的事件。
同步调用效果: 尽管Qt是基于异步和事件驱动的,但在某些情况下,你可能需要实现类似同步调用的行为,但又不希望完全阻塞线程。QEventLoop可以用来达到这种效果,例如在测试中等待特定的状态变化。
定时任务: 有时你可能需要在代码的某个点上延迟执行某段代码,但同时希望应用程序在此期间仍然响应其他事件。QEventLoop配合QTimer可以实现这种定时功能。
上一篇:蓉华教育嵌入式开发系列:[6] QT进程与线程
下一篇:蓉华教育嵌入式开发系列:「4」QT的常用控件系列