QEventLoop 的使用两例

熟悉的陌生人

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() 内部所做的事情,只不过此处不是模态对话框而已。

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

时间: 2024-12-25 06:10:38

QEventLoop 的使用两例的相关文章

PHP连接SQLServer2012两例

首先放上 PHP连接SQLServer的驱动下载地址 http://php.net/manual/zh/ref.pdo-sqlsrv.php 另外PHP for IIS管理工具 大家可以自己搜索一下 很久以前下的.现在忘记地址了. PHPManagerForIIS-1.1.2-x64.msi 第一个是比较基础的,直接创建conn 连接本机的SQLExpress实例 $conn = new PDO("sqlsrv:server=.\SQLExpress;Database=thinkphp"

子序列问题两例,第二例也用到了从后往前遍历思想

引言 子序列和子字符串或者连续子集的不同之处在于,子序列不需要是原序列上连续的值. 对于子序列的题目,大多数需要用到DP的思想,因此,状态转移是关键. 这里摘录两个常见子序列问题及其解法. 例题1, 最长公共子序列 我们知道最长公共子串的求法,先温习一下,它的求法也是使用DP思想,对于 字符串s1 和字符串s2,令 m[i][j] 表示 s1上以s1[i]结尾的子串和s2上s2[j]结尾的子串的最长公共子串长度,因为公共子串必须是连续的,因此状态转移方程:m[i, j] = (s1[i] ==

[POJ2954&POJ1265]皮克定理的应用两例

皮克定理: 在一个多边形中.用I表示多边形内部的点数,E来表示多边形边上的点数,S表示多边形的面积. 满足:S:=I+E/2-1; 解决这一类题可能运用到的: 求E,一条边(x1,y1,x2,y2)上的点数(包括两个顶点)=gcd(abs(x1-x2),abs(y1-y2))+1; 求S:刚开始做POJ2954的时候莫名其妙一直WA,用了海伦公式求面积,后来又改用割补法,还是WA.发现面积还是用叉积算的好. 在八十中走廊里看过的书都忘光了啊...这么典型的叉积运用都会选择小学方法...不过至今没

perl 递归两例

Perl 作为一门文本处理语言,自然会有他的递归写法,小弟这边分享两个例子,希望对大家能有用! 阶乘(最经典的递归) #!/usr/bin/perl -s  my $Result = 1; sub GetResult{         my $num = shift;         if( $num != 1 ){                 $Result = $Result * $num;                 print "Result:$Result | num:$num

Zabbix修正错误两例(只提供解决思路)

(1)在Zabbix的Dashboard中Status of Zabbix的: Zabbix server is running's value is "No" 解决思路,考虑是Zabbix Server的配置文件中连接数据库的账户对zabbix数据库的权限不够,修改账户的对数据库的权限: (2)ITEM收取不到数据,并报一下错误: Received value [0.05] is not suitable for value type [Numeric (unsigned)] 解决思

两例shell题(来自网友)

题目一: [[email protected] ~]# cat abc  1 aa bbb 2 cc ddd 3 ee fff 4 gg hhh 通过shell命令变为 1aabbb 2ccddd 3eefff 4gghhh 实现命令:  sed '/[0-9]/N;s/\n//;/[a-z]/N;s/\n//;n;d' abc 题目二: [[email protected] ~]# cat ip.txt  172.16.1.102 255.255.254.0 172.16.1.12 255.2

python数据结构之字符串查找两例

查找字符串中最长连续数字子串 问题描述 查找给定字符串中最长的数字字串,返回其起始下标,长度和字串.例如: input  :abc12345cd123ef234567df output:15 6 234567 实现 ''' 查找给定字符串中最长的数字字串,返回其起始下标,长度和字串.例如: input :abc12345cd123ef234567df output:15 6 234567 ''' def find_max_length_str(string): str_length = len(

跟Google 学代码 :Building Apps with Content Sharing(跟女神去表白)

本篇博客都讲了些什么? 1. Sharing Simple Data 共享简单的数据,如文本,图片,URI 2. Sharing Files 共享文件 3. Sharing Files with NFC无线传输 在写博客之前,假设 "我"是服务端App,我的"女神"是客户端App 情书是"我"想传递的数据 那么我该如何做呢? 向客户端App发送数据(暗送秋波篇) 对女神爱在心中口难开怎么办?如何示爱这是穷学生最纠结的心病 在Android 开发中

挨踢观察:勒索病毒又要瞄准移动端了?移动支付安全该怎么办?

5月12日至今,肆虐全球的WannaCry勒索病毒让全球网民度过了灰暗恐慌的一周,也让诸多普通网民真正意识到,网络安全并非只是网络公司或安全公司的事了,自己也是网络安全中的一员.据了解,WannaCry勒索病毒是黑客组织"影子经纪人"外泄的黑客工具,而该组织日前再次发出警告,将于今年6月披露更多的黑客工具,主要瞄准路由器.浏览器.Windows 10.或者手机!这就是说,第一波的勒索病毒主要针对Windows系统,而接下来的将会涉及到我们每个人的手机! 在写文章前,我想先问一个问题:你