C++ Qt 4.8.5理解QMessagebox.exec()和.show()

C++ Qt 4.8.5理解QMessagebox.exec()和.show(),c++,qt,show,qt4.8,qmessagebox,C++,Qt,Show,Qt4.8,Qmessagebox,我正在用Qt4.8.5做一个QWizard,在一些页面中,我必须关闭一些其他应用程序并退出我的程序。这很好,但现在我想显示一条弹出消息,告诉用户程序正在重新启动(我的程序中还有其他程序,我的程序是最后一个始终关闭的程序)。我用来显示弹出窗口的代码是下一个,我将它放在QWizardpage的validatepage中: QMessageBox *msgBox1 = new QMessageBox; msgBox1->setWindowTitle("Title...");

我正在用Qt4.8.5做一个QWizard,在一些页面中,我必须关闭一些其他应用程序并退出我的程序。这很好,但现在我想显示一条弹出消息,告诉用户程序正在重新启动(我的程序中还有其他程序,我的程序是最后一个始终关闭的程序)。我用来显示弹出窗口的代码是下一个,我将它放在QWizardpage的validatepage中:

  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();),这正是我想要的。。。但是弹出窗口中没有显示任何消息。。。我看不到图标、标题或文本…:我不知道为什么:(

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

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

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

非常感谢!

相关:

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

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

我会尝试以下方法:

  • 使用
    ::show()
    而不是
    ::exec()
  • 使用
    QDialog::raise()
    dialog::activateWindow()
  • (重要部分)或者
    • 在后台处理任务中调用
      QApplication::processEvents()
      (例如,在长时间运行的循环中)
    • 将后台处理生成一个线程(这可能很容易,也可能不容易,取决于代码的结构),以允许主事件循环处理对话框事件

注释的最后一行显示
show()
call没有这个功能就什么也做不了,但是你的问题是你什么都看不到……你能澄清一下吗?这似乎是一个矛盾。不管怎样,相关的半重复:@eclarkso是的,对不起,也许我解释错了……如果我不使用processEvents行,那么弹出窗口就永远不会出现,就像我没有编写代码一样……而我如果我把那行放进去,我可以看到弹出窗口,但是这个弹出窗口是空的。没有消息,没有标题,没有显示图标(而且它初始化得很好,我想如果我改变了exe的显示,那么我会看到它应该看到的(但是它会等待别人关闭它,然后再继续)希望它现在更清晰:D