Qt 事件循环、以及 QEventLoop 的简单使用:定时器例子等

目录

关于Qt的事件循环以及QEventLoop的简单使用

QEventLoop 类

--------------------------------------------------------------------

//注意:slot 函数的不同,它们只是摘录自不同的例子 而已。

//Qt5 写法 1

connect(cTimer, &QTimer::timeout, this, &Thread::timeoutSlot);

--------------------------------------------------------------------

QEventLoop 与for(;;)循环

1. 从独占式的单任务系统来理解:无限循环

实际上比较类似于一个不占用CPU时间(事件)的 for(;;)循环

2. 从共享式的多任务系统来理解:采用 时间片 来完成的无限循环

3. 从 Qt系统来理解:本质上,就是 for(;;)无限循环

3.1. QEventLoop包含了 采用时间片 来完成无限循环的方法。

3.2. 还具有其他更高级的方法和实现。

=======================================

关于Qt的事件循环以及QEventLoop的简单使用

关于Qt的事件循环以及QEventLoop的简单使用

1.一般我们的事件循环都是由exec()来开启的,例如下面的例子:

 QCoreApplicaton::exec()
 QApplication::exec()
 QDialog::exec()
 QThread::exec()
 QDrag::exec()
 QMenu::exec()

 这些都开启了事件循环,事件循环首先是一个无限“循环”,程序在exec()里面无限循环,能让跟在exec()后面的代码得不到运行机会,直至程序从exec()跳出从exec()跳出时,事件循环即被终止。QEventLoop::quit()能够终止事件循环。

EventLoop::quit()

事件循环实际上类似于一个事件队列,对列入的事件依次的进行处理,当时间做完而时间循环没有结束的时候,其实际上比较类似于一个不占用CPU时间(事件)的 for(;;)循环

其本质实际上是以队列的方式来重新分配时间片

2.事件循环是可以嵌套的,

当在子事件循环中的时候,父事件循环中的事件实际上处于中断状态,当子循环跳出exec之后才可以执行父循环中的事件。

当然,这不代表在执行子循环的时候,类似父循环中的界面响应会被中断,因为往往子循环中也会有父循环的大部分事件,执行QMessageBox::exec(),QEventLoop::exec()的时候,虽然这些exec()打断了main()中的QApplication::exec(),但是由于GUI界面的响应已经被包含到子循环中了,所以GUI界面依然能够得到响应。

3.如果某个子事件循环仍然有效,但其父循环被强制跳出,此时父循环不会立即执行跳出,而是等待子事件循环跳出后,父循环才会跳出

事件的好处1:

举几个例子吧,比如说如果想要将主线程等待100ms,总不能使用sleep吧,那样会导致GUI界面停止响应的,但是用事件循环就可以避免这一点:

 QEventLoop loop; //与 C语言变量一样可以定义存储空间;但更高级:还可以定义实现的方法。
 QTimer::singleShot(100, &loop, SLOT(quit())); //终止循坏的条件
 loop.exec(); //运行循环

事件的好处2:

还有,比如说对于一个槽函数,触发之后会弹出一个dialog,但是像下面这样写的话,窗口会一闪而过的:

 void ****::mySLot

{
     QDialog dlg;
     dlg.show();
 }

当然这里可以使用将dlg改成一个静态成员,通过增长期生存期的方法来解决这个问题,但是这里同样可以使用eventLoop来解决这个问题,使用loop的事件无限循环,当窗口关闭的时候才退出事件,结束循环:

void ****::mySLot

{
    QDialog dlg;
    dlg.show();
    QEventLoop loop;
    connect(&dlg, SIGNAL(finished(int)), &loop, SLOT(quit()));
    loop.exec(QEventLoop::ExcludeUserInputEvents);
}

————————————————
版权声明:本文为CSDN博主「XX風」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengfenglee/article/details/112208571

QEventLoop 类

一、描述

QEventLoop 类提供了一种进入和离开事件循环的方法。

任何时候都可以创建一个 QEventLoop 对象并对其调用 exec() 以启动本地事件循环。在事件循环中,调用 exit() 将强制 exec() 返回。


二、类型成员

1、enum QEventLoop::ProcessEventsFlag:此枚举控制 processEvents() 函数处理的事件类型。

    AllEvents:所有事件。
    ExcludeUserInputEvents:不处理用户输入事件。事件不会被丢弃,它们将在下次调用 processEvents() 时不带 ExcludeUserInputEvents 标志时传递。
    ExcludeSocketNotifiers:不处理Socket通知程序事件。事件不会被丢弃,它们将在下次调用 processEvents() 时不带 ExcludeSocketNotifiers 标志时传递。
    WaitForMoreEvents:如果没有挂起的事件可用,则等待事件。

三、成员函数

1、int exec(QEventLoop::ProcessEventsFlags flags = AllEvents)

    进入主事件循环并等待 exit() 被调用。返回传递给 exit() 的值。如果指定了标志,则仅处理标志允许的类型的事件。

    需要调用这个函数来启动事件处理。主事件循环从窗口系统接收事件并将这些事件分派给应用程序小部件。

    一般来说,在调用 exec() 之前不能发生任何用户交互。作为一种特殊情况,可以在调用 exec() 之前使用像 QMessageBox 这样的模态小部件,因为模态小部件使用它们自己的本地事件循环。

2、void exit(int returnCode = 0)

    事件循环以返回码退出。调用此函数后,事件循环从对 exec() 的调用返回。 exec() 函数返回 returnCode。

    按照惯例,returnCode 为 0 表示成功,任何非零值表示错误。

3、bool isRunning()

    事件循环是否正在运行。事件循环从调用 exec() 到调用 exit() 的时间段被认为是运行的。

4、bool processEvents(QEventLoop::ProcessEventsFlags flags = AllEvents)

    处理与标志匹配的待处理事件,直到没有更多事件要处理。

    如果有长时间运行的操作并希望在不允许用户输入的情况下显示其进度,则此功能特别有用(使用 ExcludeUserInputEvents 标志)。

5、void processEvents(QEventLoop::ProcessEventsFlags flags, int maxTime) (最实用)

    处理与标志匹配的挂起事件最多 maxTime 毫秒,或者直到没有更多事件要处理,以较短者为准。该函数不会连续处理事件,它在处理完所有可用事件后返回。指定 WaitForMoreEvents 标志没有意义,将被忽略。

6、void quit()

    事件循环正常退出。等同于exit(0)。

7、void wakeUp()

    唤醒事件循环。
————————————————
版权声明:本文为CSDN博主「友善啊,朋友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kenfan1647/article/details/118570966

Qt事件循环及QEventLoop的使用

Qt事件循环及QEventLoop的使用_kupeThinkPoem的博客-CSDN博客

六、QEventLoop类

QEventLoop即Qt中的事件循环类,主要接口如下:

    int exec(QEventLoop::ProcessEventsFlags flags = AllEvents)
    void exit(int returnCode = 0)
    bool isRunning() const

         
    bool processEvents(QEventLoop::ProcessEventsFlags flags = AllEvents)
    void processEvents(QEventLoop::ProcessEventsFlags flags, int maxTime)
    void wakeUp()

      其中exec是启动事件循环,调用exec以后,调用exec的函数就会被“阻塞”,直到EventLoop里面的while循环结束。
————————————————
版权声明:本文为CSDN博主「kupeThinkPoem」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kupepoem/article/details/121844578

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值