【发布时间】:2017-12-20 23:42:51
【问题描述】:
我正在尝试使用 QTimer 的超时关闭 QDialog。
到目前为止,我已经尝试过这样做:
QDialog dlg;
..
..
myTimer.start(60000); // 60 s
connect(&myTimer, SIGNAL(timeout()),
&dlg, SLOT(close())));
dlg.exec();
qWarning() << "---timer expired or key pressed--";
但是当超时被触发并且close 槽被执行时,事件循环并没有退出。 reject 插槽的行为相同。我知道done 插槽应该具有预期的行为,但由于它需要一个额外的参数(int r),它不能直接连接到timeout() 信号。
当然,我可以“中继”timeout 信号来提供缺失的参数,但还有其他更直接的方法吗?
谢谢。
【问题讨论】:
-
如何使用 done() 作为插槽:“关闭对话框并将其结果代码设置为 r。如果此对话框与 exec() 一起显示,则 done() 会导致本地事件循环完成, 和 exec() 返回 r。”
-
从堆中创建你的对话框,不要用
dlg->exec()阻塞事件循环。 -
“事件循环未退出”是什么意思?对话框没有关闭?
-
Yes 对话框未关闭且 eventloop 未退出。但真正的代码更复杂,我怀疑所有带有 QDialog 的信号和插槽都在超时时断开(信号连接到多个插槽),因此
close插槽可能永远不会被调用。