QT对话框中show和exec的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT对话框中show和exec的区别相关的知识,希望对你有一定的参考价值。

exec是qdiolog特有的 用于在对话框强制显示到最上面来 而show可以说是所有widget都有 只是普通的显示 和hide相反 参考技术A show():

显示一个非模式对话框。控制权即刻返回给调用函数。弹出窗口是否模式对话框,取决于modal属性的值。
(原文:Shows the dialog as a modeless dialog. Control returns immediately to the calling code.
The dialog will be modal or modeless according to the value of the modal property. )
exec():
显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。函数返回一个DialogCode结果。
在对话框弹出期间,用户不可以切换同程序下的其它窗口,直到该对话框被关闭。
(原文:Shows the dialog as a modal dialog, blocking until the user closes it. The function returns a DialogCode result.
Users cannot interact with any other window in the same application until they close the dialog. )
http://hi.baidu.com/zhnchxy/item/0eb0750afbf43e8302ce1b3b

Qt:如何关闭用 exec() 打开的对话框窗口?

【中文标题】Qt:如何关闭用 exec() 打开的对话框窗口?【英文标题】:Qt: How to close a dialog window opened with exec()? 【发布时间】:2016-05-01 20:12:01 【问题描述】:

我正在 Qt 中制作一个 c++ 应用程序,并且需要在某个函数完成执行后通过代码以编程方式关闭一个对话框窗口(使用 this->exec(); 打开)。

我使用的是 Qt 5.6。

提前致谢!

这是我的代码示例,它不起作用(Worker 是对话框类):

void MainWindow::on_pushButton_2_clicked()

    //When Start button clicked:
    Worker worker;
    worker.exec();
    //worker.run(1);
    worker.accept();

所以当点击pushButton_2 时,我希望打开一个对话框,显示当前进度,完成后,我希望它关闭。

【问题讨论】:

doc.qt.io/qt-4.8/qwidget.html#close @LogicStuff 我用了close(),没用。 【参考方案1】:

编辑:

现在你发布了更多代码......

worker.exec();
worker.accept(); // or worker.close();

exec() 启动 QDialog 事件处理循环,并且仅在完成时返回(在调用 accept()reject()done(int) 之后)。所以worker.accept() 将无法到达(如果使用调试器,您应该会看到)。它必须在用户操作后由worker 自己调用(按实例单击按钮)。

你的意思是:

worker.show();
QThread::sleep(2); // wait for 2 seconds
worker.accept();

然后,worker.accept() 将在某个时候执行。显示了对话框,但它是模态的。


旧帖(编辑前):

您可以调用accept() 来执行用户单击OKreject() 执行用户单击Cancel 的操作。

请注意,这些是slots,因此您可以通过将signal 连接到它们来触发它们(例如,当您的函数完成执行时发出的信号)。

例子:

void MyDialog::doSomethingAndClose()

    // do your stuff here
    accept(); // will close the dialog

或:

void MyDialog::doSomethingAndClose()

    // do your stuff here
    emit weAreDone();

如果您之前已连接(例如在 MyDialog 构造函数中):

connect( this, SIGNAL(weAreDone()), this, SLOT(accept()) );

【讨论】:

@FlareCat:应该,除非你做错了什么。我很惊讶你会this->exec()。您不是从类构造函数中调用它,是吗?您是否尝试过从班级外部调用exec()(让实体如何创建对话框来调用它)。 @FlareCat:那么您需要发布更多代码。您没有发布足够的代码让我们提供帮助。你没有发布任何内容。一般规则是调用accept()reject()done() 来中断对话的exec() 循环。 好的,我编辑了我的问题以添加我的代码部分。给出的代码在我的mainwindow.cpp 好的,现在使用您的编辑:当我运行show 然后accept 时,函数运行,但窗口永远不会打开。用于启动该功能的按钮会保持突出显示一段时间,但随后会恢复正常。有什么想法吗? @FlareCat:已编辑。尝试一下sleep worker 应该会显示两秒钟。【参考方案2】:

只需将您的自定义信号与QDialog::done(int) 连接,并在您的函数执行完成后发出信号。

【讨论】:

我能举个简单的例子吗?我对 Qt 有点陌生,并且不太确定这意味着什么。 (我知道信号和槽。)【参考方案3】:

正如我刚刚了解到的,这个问题是由于 gui 没有自动更新引起的。

Here 是解决此问题的 SO 问题的链接。

【讨论】:

以上是关于QT对话框中show和exec的区别的主要内容,如果未能解决你的问题,请参考以下文章

QT详细解释一下QDialog中exec与open的区别

qt 模态对话框可以互相调用吗

Qt:如何关闭用 exec() 打开的对话框窗口?

QT之两种模态对话框的调用

QT Qdialog

Qt之菜单栏,和对话框