2016-02-24 78 views
0

我做了QWizard與QT 4.8.5在一些網頁我不得不關閉一些其他應用程序和退出我的程序。這工作正常,但現在我想顯示一個彈出消息,告訴用戶程序正在重新啓動(其他人是我的一部分,我的是最後一個總是要關閉的)。我用它來顯示彈出式菜單中的代碼是下一個,我把它放在一個QWizardpage的validatepage:的Qt 4.8.5瞭解QMessageBox提示.exec()和.show()

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 

所以事情是:與該代碼,當我在wizardpage並單擊完成,它在程序重啓其他應用程序的同時(後面)啓動QMessageBox,然後關閉自身(使用QApplication :: quit();),這正是我想要的......但是沒有消息顯示在彈出窗口中。 ..我看不到圖標,標題或文本...:SI不知道爲什麼:(

而當使用 - > EXEC();而不是表演,圖標,標題和正文顯示出來,但當彈出窗口出現時,在用戶關閉彈出窗口之前不會做任何事情......:S

我明白.exec()凍結所有,直到用戶關閉彈出而顯示不...

所以...我怎麼能看到與節目()行爲的文本?我不希望用戶與彈出交互,我只需要彈出展現出來,同時關閉所有,直到我的程序關閉太...

太謝謝你了!

+0

註釋的最後一行說,'顯示()'調用不做什麼沒有這一點,但你的問題說,你看不到任何東西......你能澄清?這似乎是一個矛盾。 無論如何,有關半重複數據刪除:http://comments.gmane.org/gmane.comp.lib.qt.general/30706 – eclarkso

+0

@eclarkso是的,對不起,也許我錯了wxplained ...如果我不使用processEvents行,那麼彈出窗口永遠不會顯示,就像我沒有創建該代碼一樣......如果我放置該行,我可以看到彈出窗口,但彈出窗口是空的。 。沒有消息,沒有標題沒有圖標顯示(並且它的初始化我覺得好像我改變了一個EXE的表演,然後我看到它應該(但是然後它等待有人關閉它,然後繼續)現在希望它更清晰:D – Megasa3

回答

1

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

綜上所述,QDialog::exec()有自己的事件循環創建一個模式對話框(不管你Qt::NonModal設置),並::show()沒有。

所以你的情況,::exec()將完全呈現對話框,但它的阻止您的後臺處理的其餘部分。 ::show()不會被阻塞,但是由於它與您的其他代碼共享事件循環,因爲您的後臺代碼,它不會清空事件隊列(其中包含對話中的所有show/layout/render事件)。

我會嘗試以下方法:

  • 使用使用QDialog::raise()Dialog::activateWindow()
  • (重要組成部分)
    • 通話要麼::show()::exec()
    • 力的對話框前QApplication::processEvents()在你的後臺處理任務中(例如,在長時間內nning循環)。
    • 產生你的後臺處理到一個線程(這可能會也可能不容易,這取決於你的代碼的結構)以允許主事件循環來處理你的對話事件。