QEventLoop 的使用两例

摘要:
在如何让Qt程序的Sleep和QDialog模态对话框与事件循环两个短文中,我们可以看到QEventLoop的使用。如何自己使用QEventLoop的,又有什么用呢?QEventLoopManual中说的很简洁Atanytime,youcancreateaQEventLoopobjectandcallexec()onittostartalocaleventloop.Fromwithintheeventloop,callingexit()willforceexec()toreturn.在任何时候,你都可以创建一个QEventLoop的对象,然后调用它的exec()来开始一个局部的事件循环。答案是,可以voidXXXX::slot1(){QDialogdlg;dlg.show()QEventLooploop;connect;loop.exec;}恩至此,问题解决。

熟悉的陌生人

Qt 是事件驱动的,所以当你用Qt的时候,几乎时时刻刻和 QEventLoop 打交道、,只是你可能没有意识到:

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

在前面列出的这些常见函数的背后,都有各自的QEventLoop,可能是我们很少有机会想到自己显式使用QEventLoop的缘故吧,对这个类似乎总是有些陌生。

如何让 Qt 程序的 SleepQDialog 模态对话框与事件循环两个短文中,我们可以看到 QEventLoop 的使用。那么?如何自己使用 QEventLoop 的,又有什么用呢?

QEventLoop

Manual 中说的很简洁

At any time, you can create a QEventLoop object and call exec() on it to start a local event loop. From within the event loop, calling exit() will force exec() to return.

在任何时候,你都可以创建一个QEventLoop的对象,然后调用它的exec() 来开始一个局部的事件循环。

看Manual容易让人头大,那么,看例子吧:

让主线程等待100ms?

直接sleep一下行么,显然,如果你的用户不介意你的程序界面不响应用户操作,没问题!可是如果介意呢?

此时,开启一个局部的事件循环,让其执行100ms后自己退出,似乎很不错。写来看看:

QEventLoop eventloop;
QTimer::singleShot(100, &eventloop, SLOT(quit()));
eventloop.exec();
  • 创建事件循环
  • 启动定时器,让其100ms后触发事件循环的quit()槽
  • 启动事件循环

注:让主线程等待有其他方法,此处略过。

窗口一闪而过?

不少人遇到过这个问题:在一个槽函数内创建了一个窗口对象,却没有看到窗口弹出来,或者看到窗口一闪而过。比如:

void XXXX::slot1()
{
    QDialog dlg;
    dlg.show()
}

当然,大家都知道原因:因为到了后面的大括号处,dlg因为出作用域,会被析构掉。解决方法很简单,增大w的生存时间即可。比如:

  • 将 dlg 作为类的成员,而不是函数的局部变量
  • 将 dlg 前面添加 static,作为静态成员
  • 将 dlg 用 new 分配到 heap 中
  • ...

能否用 QEventLoop 来解决呢?答案是,可以

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

恩至此,问题解决。其实,这也是 QDialog::exec() 内部所做的事情,只不过此处不是模态对话框而已。

http://blog.csdn.net/dbzhang800/article/details/6300519

免责声明:文章转载自《QEventLoop 的使用两例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇第四代自动泊车从APA到AVP技术浅析射线检测 raycast 的使用 !Cocos Creator 3D !下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

解决ajax异步请求数据后swiper不能循环轮播(loop失效)问题、滑动后不能轮播的问题。

问题描述: 1、我使用axios异步请求后台的图片进行渲染后不能实现循环轮播,也就是loop失效,但是静态写死的情况下不会出现这种问题。 2、 分析: swiper的机制是:初始化的时候将swiper-warpperslide类下的最后一个swiper-slide块克隆到第一个的位置,将第一个swiper-slide块克隆岛最后一个的位置,然后自动扫描sw...

iOS开发-Runloop详解(简书)

不知道大家有没有想过这个问题,一个应用开始运行以后放在那里,如果不对它进行任何操作,这个应用就像静止了一样,不会自发的有任何动作发生,但是如果我们点击界面上的一个按钮,这个时候就会有对应的按钮响应事件发生。给我们的感觉就像应用一直处于随时待命的状态,在没人操作的时候它一直在休息,在让它干活的时候,它就能立刻响应。其实,这就是run loop的功劳。 一、线...

MIL/SIL/PIL/HIL/VIL

MIL:Model in the loop 模型在环,对模型在模型的开发环境下(如SIMULINK)进行仿真,通过输入一系列的测试用例,验证模型是否满足设计的功能需求。验证控制算法模型是否准确地实现了功能需求,MIL是所有测试中最关键的。 SIL:Software in the loop 是一种等效性测试,测试的目的是验证代码与控制模型在所有功能上是完全一...

Run Loop

学习过程中,将Threading PG中的Run Loops翻译了下,权当是做为笔记。原文见 Run Loops。 20110526 转载请注明,谢谢。 http://www.cnblogs.com/scorpiozj/ Run loops是线程的基础架构部分。一个run loop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。使用run loo...

libuv::进程

对于基于事件(event-based)的程序来说, 有个限制,没办法很好地利用多核,提高CPU使用率. 即使能够使用多线程编程来分发 handle, 但是每个 loop 还是只有一个线程. 这时候, 使用多进程就能够分担 loop 的压力,并且通过多进程 + 通信的方法, 会比 多线程 + 共享内存的方法更加安全, 易于开发. #include <c...

h5-audio/video标签

音频/视频 基础用法 属性 事件 audio元素和video元素 <audio src="http://t.zoukankan.com/成都.mp3"></audio> <video src="http://t.zoukankan.com/成都.mp4"></video> 一些属性 1、autoplay 自动...