【问题标题】:Will QMessageBox block the running of the whole main thread in Qt?QMessageBox会阻塞Qt中整个主线程的运行吗?
【发布时间】:2014-10-22 07:54:14
【问题描述】:

我是 Qt 新手

我的情况是:由于某种原因,我必须从主线程发出心跳信号,同时我想使用以下方法创建一个 QMessageBox 窗口:

reply = QMessageBox::question(this, tr("Sure want to quit?"), tr("Sure quit?"), QMessageBox::Yes|QMessageBox::No);

我只是想让这个消息框阻止用户从其他窗口输入,但我不想阻止心跳信号。 我该怎么做?还是在 Qt 中默认完成?

【问题讨论】:

    标签: c++ qt qmessagebox


    【解决方案1】:

    QMessageBox::question 在内部执行事件循环。所以一切继续运行。你不必担心这个。

    但是,您可以使用这些功能获得奇怪的效果。例如。如果您的心跳可以打开一个对话框,即使另一个对话框已经打开,该对话框也会打开。 还假设您有一个 TCP/IP 堆栈正在运行。这个堆栈可以做的所有事情都将继续发生......无论 QMessageBox::question() 当前在哪里执行......就像在某个函数的中间。

    这就是为什么我们公司有一个政策禁止使用 QMessageBox::question() (和类似的)并在我们的应用程序中的对话框上调用 exec() 。我们在堆上创建模态对话框并使用它们的信号。

    【讨论】:

    • 在我的情况下,“在对话中调用 exec()”会停止心跳信号吗?能否举一个简短的例子说明贵公司是如何做到的,非常感谢。
    • @Nyaruko 不,QDialog::exec 做同样的事情。它创建一个本地事件循环。本地事件循环可能很糟糕。您可以阅读this article 了解原因。
    • 在本地事件循环中最值得注意的是deleteLater 执行。正是为了防止this 导致deleted 崩溃。 (如果您实际上是 delete 父级,则不会帮助您,但如果您使用 deleteLater 它会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多