首页 > 其他分享 >Qt 事件循环

Qt 事件循环

时间:2023-02-01 15:11:33浏览次数:42  
标签:Qt 程序 事件驱动 循环 事件 message

一、QT消息/事件循环机制
  Qt作为一个可视化GUI界面操作系统,是基于事件驱动的,我们程序执行的顺序不再是线性的,而是由一个个应用程序内部或外部的事件进行驱动的,无事件时便阻塞。这个有点类似于while循环,函数体内不断处理用户的输入,类比到事件循环中,用户点击了鼠标,按下了键盘,便称为事件。
  一般对于带UI窗口的程序来说,“事件”是由操作系统或程序框架在不同的时刻发出的。当用户按下鼠标,敲下键盘,或是窗口需要重新绘制的时候,或是计时器触发的时候,都会发出一个相应的事件。下面是一个抽象的“循环事件”的代码:

 1 function eventloop()
 2 {
 3     initialize();
 4     bool shouldQuit = false;
 5     whlie (false == shouldQuit)
 6     {
 7         var message = get_next_message();
 8         process_message(message);
 9         if (message == QUIT)
10         {
11             shouldQuit = true;
12         }
13     }
14 }

机制解释:
  这样的程序运行流程,叫做“事件驱动”式的程序。一般的Qt程序,main函数中都会有一个QCoreApplication/QGuiApplication/QApplication,并在末尾调用exec。Application中的这个EventLoop,叫做“事件循环”,所有的事件分发、事件处理都从这里开始。Application还提供了sendEvent和poseEvent两个函数,分别用来发送事件。sendEvent发出的事件会立即被处理,即“同步”执行。poseEvent发送的事件会被加入事件队列,在下一轮事件循环时才处理,即“异步”执行。

二、两个问题
1.Qt是事件驱动的,怎么理解这句话
  Qt将系统产生的信号(软件中断)转换成Qt事件,并且将事件封装成类,所有的事件类都是由QEvent派生的,事件的产生和处理就是Qt程序的主轴,且伴随整个程序的运行周期。因此说Qt是事件驱动的。

2.Qt事件由谁产生的?
  事件有两个来源:程序内部和程序外部,多数情况下来自操作系统并且通过spontaneous()函数返回true来获知事件来自程序外部,当spontaneous()函数返回false时说明事件来自程序内部。

三、Qt事件处理流程
  事件循环:事件是一个类对象,具有特定的类型,多数情况下是被分发到一个队列中(事件队列),当队列中有事件时就不停地将队列中的事件发送给QObject对象,当队列为空时,就阻塞地等待事件。

 QCoreApplication::exec()开启了这种循环,一直到QCoreApplication::exit()被调用才终止,所以说事件循环是伴随着Qt程序的整个运行周期。
另外一种同步处理情形是通过sendEvent()将事件发送出去,直接进入事件的传送和处理流程。

 

标签:Qt,程序,事件驱动,循环,事件,message
From: https://www.cnblogs.com/ybqjymy/p/17082833.html

相关文章

  • 为RecyclerView添加优雅的点击事件、长按事件
    本篇参考:​​Hugo的文章-GettingyourclicksonRecyclerView​​效果如下![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/695c7c9139533136f726431d4f332......
  • react的合成事件
    react自己有一套自己的事件机制,它在DOM事件体系基础上做了改进,减少了内存消耗,并且最大程度的消除了ie等浏览器的不兼容问题。它的特点有以下几个:react上注册的事件最终会......
  • Qt QString::contains() QString::startsWith() 在字符串中检索字符串
    函数QString::startsWith()判断一个字符串是否以某个字符串开头。此函数具有两个参数,第一个参数指定了一个字符串,第二个参数指定是否大小写敏感(默认情况下,是大小写敏......
  • 为RecyclerView添加点击事件、长按事件
    本篇展示手机内已安装的软件信息,并添加事件,效果如下一、准备工作保存App信息的beanpublicclassAppInfo{publicStringname;//应用名publicStringp......
  • python pyqt5简单界面
    ​​https://doc.qt.io/qtforpython/PySide6/QtWidgets/QTableWidget.html​​importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QDesktopWidget,QHBoxLayou......
  • qt5模板
    fromPyQt5.Qtimport*importsysfromtextimportUi_MainWindowclassWindow(QMainWindow):def__init__(self,parent=None,*args,**kwargs):super().__i......
  • pyqt5 简单工具类
    fromPyQt5.QtWidgetsimportQPushButton,QLabel,QLineEdit,QTextEdit,QPlainTextEdit,QCheckBoxfromPyQt5.QtWidgetsimportQComboBox,QRadioButtonclassMYWIDGET():......
  • pyqt5 简单模板
    importsysfromPyQt5.QtCoreimportQtfromPyQt5.QtWidgetsimportQWidget,QDesktopWidget,QVBoxLayout,QHBoxLayout,QApplication,QButtonGroupfromutils.tableUt......
  • 项目运行报错:目标进程已退出,但未引发 CoreCLR 启动事件。
      项目运行报错:目标进程已退出,但未引发CoreCLR启动事件。请确保将目标进程配置为使用.NETCore。如果目标进程未运行.NETCore,则发生这种情况并不意外。 解决方......
  • jQuery对象和JS对象区别与转换 jQuery事件绑定&入口函数&样式控制
    jQuery对象和JS对象区别与转换  JQuery对象和JS对象区别与转换1.JQuery对象在操作时,更加方便。2.JQuery对象和js对象方法不通用的.3.两者相互转换......