Qt 4.8.5 Understanding QMessagebox .exec() and .show()

Qt 4.8.5 Understanding QMessagebox .exec() and .show()

本文关键字:and show exec QMessagebox Understanding Qt      更新时间:2023-10-16

我正在使用QT 4.8.5进行QWizard,在某些页面中,我必须关闭其他一些应用程序并退出我的程序。这工作正常,但现在我想显示一条弹出消息,告诉用户程序正在重新启动(还有其他人是我的一部分,我的是最后一个总是关闭的)。我用来显示弹出窗口的代码是下一个代码,我将其放在 QWizardpage 的验证页面中:

  QMessageBox *msgBox1 = new QMessageBox;
    msgBox1->setWindowTitle("Title...");
    msgBox1->setIcon(QMessageBox::Information);
    msgBox1->setText(" blablablalbal bla bla bla.");
    msgBox1->setWindowModality(Qt::NonModal);
    msgBox1->show();
    QCoreApplication::processEvents(); // without this line, the show does nothing and I can't see my pop up window

所以问题是:使用该代码,当我在该向导页面中并单击以完成时,它会在程序重新启动其他应用程序时启动 QMessageBox,然后自行关闭(使用 QApplication::quit(); ),这正是我想要的......但是弹出窗口中没有显示任何消息...我看不到图标,标题或文本... :S 我不知道为什么:(

而当使用 ->exec(); 而不是显示时,图标、标题和文本会显示,但是当弹出窗口出现时,在用户关闭该弹出窗口之前不会执行任何操作... :S

我知道 .exec() 会冻结所有内容,直到用户关闭弹出窗口而显示不...

那么......我怎样才能看到带有show()行为的文本?我不希望用户与该弹出窗口进行交互,我只需要弹出窗口在关闭所有弹出窗口时显示,直到我的程序也关闭......

非常感谢!

相关:http://comments.gmane.org/gmane.comp.lib.qt.general/30706

总之,QDialog::exec()会创建一个具有自己的事件循环的模式对话框(无论您的Qt::NonModal设置如何),而::show()不会。

因此,在您的情况下,::exec()将完全呈现对话框,但它会阻止其余的后台处理。 ::show()不会阻塞,但由于它与其他代码共享事件循环,因此由于背景代码,它无法清空事件队列(其中包含对话框中的所有显示/布局/呈现事件)。

我会尝试以下方法:

  • 使用::show()::exec()
  • 使用QDialog::raise()Dialog::activateWindow()强制对话框置于最前面
  • (重要部分)要么
    • 在后台处理任务中调用QApplication::processEvents()(例如,在长时间运行的循环中)。
    • 将后台处理生成到线程中(这可能很容易,也可能不容易,具体取决于代码的结构),以允许主事件循环处理对话事件。