簡體   English   中英

Qt:mainWindow-> show(); 不顯示mainWindow

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM