2010-12-03 96 views
2

在下面的代碼中,我創建一個窗口,調用window.show(),但該窗口不會顯示,直到調用window->iterateSolution()之後。幾乎就好像,app.exec()是顯示窗口的函數。我對Qt非常陌生,所以我不知道發生了什麼。Qt:mainWindow-> show();不顯示主窗口

#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(); 
} 

回答

4

這就是發生了什麼事情。從技術上講,QMainWindow :: show()不會使窗口可見,它只是在窗口中設置一個標誌,並且Qt會使它在事件循環的下一次迭代中可見。

而且,直接從Qt的對文檔的QApplication :: EXEC():

有必要調用這個函數 啓動事件處理。主要的 事件循環接收來自 窗口系統的事件,並將這些事件分派給 應用程序小部件。

通常,在調用exec()之前,不會發生用戶交互 。

+0

好的,但我想在哪裏執行我的功能? – dfetter88 2010-12-03 23:07:50

0

聽起來像你想要一個多線程應用程序。一個線程應該負責UI,另一個線程將解決多維數據集並將更新發布到UI線程以顯示進度。您可以使用信號和插槽來使Cube對象和mainWindow對象進行通信,以解決跨線程通信問題(請參閱http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/)。否則,如果您將兩個操作放在同一個線程中,UI將「掛起」,因爲主線程將無法處理UI事件(包括您在問題中特別提到的顯示事件) 。

如果這是矯枉過正,您可以通過在任何長時間運行的同步操作之前(以及最好是在期間)調用QApplication :: process(...)來指示應用程序顯式處理UI事件。這將對用戶界面執行一次性更新,以便用戶(和操作系統)知道應用程序未掛起。