2010-12-03 5 views
2

以下のコードでは、ウィンドウを作成してwindow.show()を呼び出しますが、が呼び出されるまでウィンドウは表示されません。ほとんどの場合、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はイベントループの次の繰り返しで可視にします。ストレートはQApplication上のQtのドキュメントからも

、:: EXEC():

イベント処理を開始するには、この機能 を呼び出す必要があります。メインの イベントループは、 ウィンドウシステムからイベントを受信し、これをアプリケーションウィジェット にディスパッチします。

一般に、 はexec()を呼び出す前にユーザーのやりとりができません。

+0

私の機能をどこで実行したいですか? – dfetter88

+2

mainWindowの "実行"スロットのmainWindow-> show()とapp.exec()の間にコードを置き、QTimer :: singleShot(0、mainWindow、SLOT(run()))を使用して、イベントループ。 – baysmith

+0

通常、まだ見えなくなっているウィジェットが表示される前に操作することもできます。 –

0

マルチスレッドアプリケーションを使用したいと思うように私に聞こえます。 1つのスレッドがUIを担当し、別のスレッドがキューブを解決し、進行状況を表示するUIスレッドに更新を通知します。シグナルとスロットを使用してCubeオブジェクトとmainWindowオブジェクトを通信させて、スレッド間通信の問題を解決できます(http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/を参照)。

両方の操作を同じスレッドに置くと、メインスレッドがUIイベント(特にあなたの質問で参照しているshowイベントを含む)を処理できなくなるため、UIがハングします。

これが過剰である場合は、長時間実行されている同期操作の前に(そして好ましくは実行中に)QApplication :: process(...)を呼び出して、アプリケーションに明示的にUIイベントを処理するように指示できます。これにより、ユーザー(およびOS)がアプリケーションがハングアップしていないことを認識できるように、UIに対する1回の更新が実行されます。