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