一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

一、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()将事件发送出去,直接进入事件的传送和处理流程。

 

posted on 2023-02-01 15:02  一杯清酒邀明月  阅读(315)  评论(0编辑  收藏  举报