找回密码
 立即注册
收起左侧

关于exce与Qtimer的问题,涉及到事件循环机制与Qtimer实现

4
回复
4846
查看
[复制链接]
累计签到:1 天
连续签到:1 天
来源: 2019-7-26 20:41:45 显示全部楼层 |阅读模式
1Qter豆
想问一下关于以下代码:
MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
{
        ui.setupUi(this);
        time = new QTimer();
        time->start(1000);
        time2 = new QTimer();
        time2->start(5000);
        connect(time,SIGNAL(timeout()),this,SLOT(slotTimeoutProcess()));
        connect(time, SIGNAL(timeout()), this, SLOT(slotTimeoutProcess2()));
}
void MainWindow::slotTimeoutProcess(){//槽1
        //do something
}

void MainWindow::slotTimeoutProcess2(void) {//槽2
        QDialog dialog;
        dialog.exec();
}


(1)当我将time的超时信号绑定到槽1和槽2时,当槽2的dialog调用exec()后,进入模态模式。此后永远无法进入槽1
(2)当我将time超时绑定槽1,time2超时绑定槽2,则可以正常按时进入槽2。
      我现在感觉搞不清楚其中的原理,请问有大神能够答疑解惑吗?或者我想深入理解其中机制,应该看些哪方面的知识点呢?

回复

使用道具 举报

累计签到:41 天
连续签到:1 天
2019-7-26 22:05:37 显示全部楼层
qt的定时器在主线程,也就是界面刷新线程中运行。dialog的exec调用是阻塞式的,因此除非exec返回(比如关闭对话框或者单击ok、cancel等按钮),才能退出槽函数2,这时定时器才能继续运作,比如定时器1超时后触发槽函数1.
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2019-7-27 11:17:25 显示全部楼层
谢谢你的回答。
但是为什么不用time绑定到槽函数1,而是改用用time2绑定到槽函数1后,就能一直继续运作呢。
总的来说,当调用exec()后,进入事件循环,但是可以侦测到time2的超时事件,但是不能侦测到time的超时事件了。这里就有点不明白内部机制了。

点评

我误解了你的意思,本以为你说time绑到cao1,time2绑到槽2后,槽1可以正常运行。后来发现你说的是槽2可以按时进入。抽空测试一下给你答复。  详情 回复 发表于 2019-7-27 23:04
回复

使用道具 举报

累计签到:41 天
连续签到:1 天
2019-7-27 23:04:32 显示全部楼层
kangchi0225 发表于 2019-7-27 11:17
谢谢你的回答。
但是为什么不用time绑定到槽函数1,而是改用用time2绑定到槽函数1后,就能一直继续运作呢。 ...

我误解了你的意思,本以为你说time绑到cao1,time2绑到槽2后,槽1可以正常运行。后来发现你说的是槽2可以按时进入。抽空测试一下给你答复。
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2019-7-31 17:59:14 显示全部楼层
dialog.exec 之后, timeout 的事件就无法被 MainWindow 接收了,因为 Dialog 开启了事件循环,阻止了 main 函数里面的 a.exec(),所有的事件都不会传递给 MainWindow 对象了 ~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了