[英]Qt: mainWindow->show(); does not show the mainWindow
在下面的代碼中,我創建一個窗口,調用window.show()
,但是直到調用window->iterateSolution()
之后,該窗口才會顯示。 幾乎好像app.exec()
是顯示窗口的函數。 我對Qt很陌生,所以我不知道發生了什么。
#include <QtGui/QApplication>
#include <mainWindow.h>
#include <Cube.h>
mainWindow * newWindow;
int main(int argc, char *argv[]) {
// initialize resources, if needed
// Q_INIT_RESOURCE(resfile);
QApplication app(argc, argv);
newWindow = new mainWindow;
newWindow->show();
QString initialState = "YWOBYYBYYGRRGRRBWWYOOYGGRGGBBGYOOYOOWRRBBRBBWGOOGWWRWW";
/* Construct cube, set state, and solve */
Cube * cube = new Cube(initialState);
QString solution = cube->solve();
delete cube;
newWindow->iterateSolution(solution);
// create and show your widgets here
return app.exec();
}
這就是正在發生的事情。
從技術上講,QMainWindow :: show()不會使窗口可見,它只是在窗口中設置一個標志,而Qt將使其在事件循環的下一次迭代中可見。
同樣,直接來自Qt關於QApplication :: exec()的文檔:
必須調用此函數來開始事件處理。 主事件循環從窗口系統接收事件,並將其分派給應用程序小部件。
通常,在調用exec()之前無法進行任何用戶交互。
在我看來,您想要一個多線程應用程序。 一個線程應該負責UI,另一個線程將解決多維數據集並將更新發布到UI線程以顯示進度。 您可以使Cube對象和mainWindow對象使用信號和插槽進行通信,以解決跨線程通信問題(請參閱http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use- qthreads-the-full-explanation / )。
否則,如果您將兩個操作都放在同一線程上,則UI將“掛起”,因為主線程將無法處理UI事件(包括您在問題中專門提到的show事件)。
如果這是多余的,則可以通過在任何長時間運行的同步操作之前(最好在此期間)調用QApplication :: process(...)來指導應用程序顯式處理UI事件。 這將對UI執行一次更新,以便用戶(和OS)知道該應用程序未掛起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.