我正在使用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()
(例如,在长时间运行的循环中)。 - 将后台处理生成到线程中(这可能很容易,也可能不容易,具体取决于代码的结构),以允许主事件循环处理对话事件。
- 在后台处理任务中调用