超时后如何关闭并退出exec()显示的QDialog?

时间:2017-12-20 11:43:00

标签: c++ qt

我正在尝试使用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插槽时,不会退出eventloop。与reject广告位相同的行为。我知道done槽应该具有预期的行为,但由于它需要一个额外的参数(int r),它不能直接连接到timeout()信号。

当然,我可以&#34;接力&#34; timeout信号提供缺失的参数,但还有另一种更简单的方法吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

dlg.exec();是同步的,他会回答接受或拒绝的答案。

void MainWindow::btnClicked() {
    Dialog *dialog = new Dialog();
    dialog.exec();
    qDebug() << "test"; 
    // while dialog not destroyed (rejected, accepted) Print will not happen never. 
}

您可以在Dialog类中使用QTimer的一种方法:

Dialog::dialog(...) {
    //constructor
    QTimer::singleShot(60000, this, SLOT(close()));
}

或者不要使用dialog.exec();使用dialog.show();如果你想要对话,那就让它成为你可以使用的模态:

void MainWindow::btnClicked() {
    Dialog *dialog = new Dialog();
    dialog->setModal(true);
    dialog->show();
    qDebug() << "test"; //The "test" will be printed, and you can use QTimer :))
 }

答案 1 :(得分:2)

我建议给对话框自己的计时器(即在切换对话框之前在本地实例化QTimer):

QTimer dlg_timer;
dlg_timer.start(60000); // 60 s
connect(&dlg_timer, SIGNAL(timeout()), &dlg, SLOT(close()));
dlg.exec();
dlg_timer.stop();

由于OP担心他们的评论,如果定时器超时信号已连接到其他某个插槽,在连接对话框关闭之前,并且在该插槽中调用QTimer::disconnect(),则永远不会调用对话框关闭插槽