熟悉的陌生人
Qt 是事件驱动的,所以当你用Qt的时候,几乎时时刻刻和 QEventLoop 打交道、,只是你可能没有意识到:
- QCoreApplicaton::exec()
- QApplication::exec()
- QDialog::exec()
- QThread::exec()
- QDrag::exec()
- QMenu::exec()
- ...
在前面列出的这些常见函数的背后,都有各自的QEventLoop,可能是我们很少有机会想到自己显式使用QEventLoop的缘故吧,对这个类似乎总是有些陌生。
在
如何让 Qt 程序的 Sleep
和
QDialog 模态对话框与事件循环
两个短文中,我们可以看到 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() 内部所做的事情,只不过此处不是模态对话框而已。
分享到:
相关推荐
5.保证无毒 1.简单,方便,实用 3.实例可以自行改用 1.如有非法,本人无法律责任! 8.更多作品,查找标签“朱建强”7.... 4.如需联系我请看左边数字!1.如不知代表何物,那就放弃计算机吧! 0....CSDN老板不让我上传联系方式。
内容: 1: 讲解QEventLoop, QEvent, QTimer, QThread一些基础理论 2: 讲解QTimer, QThread, QEvent,一些Warning, Error出错整理 使用人群;: qt 入门小白, 对QTimer, QThread, QEvent,一些Warning, Error...
使用Qt实现事件循环 作者: 马克·哈维斯顿(Mark Harviston)< >,克努森(Arve Knudsen)< > 要求 Quamash需要具有asyncio移植的asyncio库和PyQt4,PyQt5或PySide的Python 3.4或Python 3.3。 安装 pip ...
1.QNetworkAccessManager、QNetworkRequest、QNetworkReply详细使用 2.http请求及响应应用 3.QEventLoop阻塞 4.支持form-data类型
Qt5.15.2静态编译MSVC2019 Release版
Qt之无边框界面包括最大化、最小化和关闭按钮及实现可移动、窗口伸缩功能
用GIF来实现QT等待对话框,其中必须用QEventloop否则会出现等待对话框不消失的问题。
2. QApplication::exec() 3. QCoreApplication::exec() 4. QEventLoop::exec(ProcessE
该视频课程内容涉及QT IDE的使用技巧、标签Label、按钮PushButton、输入输出LineEdit、下拉选择ComboBox、函数Function、槽函数Slots、信号Signals、链接函数Connection、Qt类封装、QtObject类分析、控件布局QLayout...
#include <QEventLoop> #include #include QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACE class Dialog : public QDialog { Q_OBJECT public: Dialog(QWidget *parent = nullptr); ~...
直接使用qt已经封装好的多线程函数 run() 重写run()函数,run()为纯虚函数,需要在子类中重写 run()里面才是子线程 子线程中启用事件循环exec(); 问题 多线程启动失败,并出现QThread: Destroyed while ...