Qt 4.8.5了解QMessagebox .exec()和.show()

时间:2016-02-24 16:19:42

标签: c++ qt show qt4.8 qmessagebox

我正在使用QT 4.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( );)这正是我想要的......但是弹出窗口中没有显示任何消息......我看不到图标,标题或文字......:SI不知道原因:(< / p>

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

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

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

非常感谢你!

1 个答案:

答案 0 :(得分:1)

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

总之,Error:The markup in the document preceding the root element must be well-formed. 使用自己的事件循环创建了一个模式对话框(无论您的QDialog::exec()设置如何),Qt::NonModal没有。

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

我会尝试以下方法:

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