1

我正在使用 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不知道为什么:(

而当使用 ->exec(); 而不是显示,而是显示图标,标题和文本,但是当弹出窗口出现时,在用户关闭该弹出窗口之前什么都不做......:S

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

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

太感谢了!

4

1 回答 1

3

相关: 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()(例如,在长时间运行的循环中)。
    • 将您的后台处理生成到一个线程中(这可能会或可能不会容易,具体取决于您的代码结构)以允许主事件循环处理您的对话框事件。
于 2016-02-24T17:27:01.630 回答