【问题标题】:Qt 4.8.5 Understanding QMessagebox .exec() and .show()Qt 4.8.5 理解 QMessagebox .exec() 和 .show()
【发布时间】:2016-02-24 16:19:41
【问题描述】:

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

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

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

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

非常感谢!

【问题讨论】:

  • 评论的最后一行说show() 调用没有这个,但你的问题说你什么都看不到......你能澄清一下吗?这似乎是一个矛盾。无论如何,相关的半骗子:comments.gmane.org/gmane.comp.lib.qt.general/30706
  • @eclarkso 是的,对不起,也许我解释错了...如果我不使用 processEvents 行,那么弹出窗口永远不会出现,就好像我没有编写该代码一样...虽然如果我放那行,我可以看到弹出窗口,但是这个弹出窗口是空的..没有消息,没有标题没有显示图标(并且它的初始化很好,我想好像我改变了一个 exe 的显示然后我看到它它应该(但在继续之前它会等待某人关闭它)希望现在更清楚:D

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


【解决方案1】:

相关: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()
    • 将您的后台处理生成到一个线程中(这可能会也可能不会容易,具体取决于您的代码结构)以允许主事件循环处理您的对话框事件。

【讨论】:

    猜你喜欢
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多