0

(素晴らしい) Qt4 ライブラリを使用して C++ で簡単なゲームを書いています。しばらくの間、私は次のことに問題があります。

ウィジェットは (特に) 2 つのメソッドを提供します。これらのメソッドは、ウィジェットがマウスの動きやクリックなどのユーザー入力に応答する方法を変更します。これらの関数fun1()を呼び出しfun2()て、コンテキストを回避しましょう。これらの関数はすべて、すべてのイベント関数 (例: mouseMoveEvent()) によってチェックされるウィジェット内のいくつかの内部変数を切り替えます。がfun1()呼び出されると、ユーザーはウィジェットを操作してどこかをクリックすることで移動を実行することが期待されます。ウィジェットは、彼の動きが有効かどうかをチェックし、そうであれば、彼の動きを現在のゲーム状態に適用します。

ここで、このウィジェットを含むメイン クラスがいくつかの時点で呼び出しfun1()fun2()その後. fun1()移動が完了するまでメインループが最後に留まるように、何か (エレガント) を実装する必要があります。

void Widget::fun1()
{
    // Set some members in order to tell the Widget how to respond to events
    // ...
    wait(); // wait for the move to be completed before returning from fun1()
}

wait()GUI の応答性を維持しながら、つまりユーザーの操作に応答しながら、どのように実装する必要がありますか?

以前は、ウィジェットの親に、ウィジェットが終了を通知するシグナルを発行するまで待機させることで、この問題を解決していました。この信号が受信されたときだけ、私は を呼び出しfun2()ました。これはうまくいくかもしれませんが、ウィジェット自体ではなく、ウィジェットを使用してクラスの責任を待つという行為になるのが気になります。

どんな提案もとても役に立ちます!

4

1 に答える 1

1

まず、私自身の質問に答えてしまったことをお詫びさせてください。私がすでに試した解決策はうまくいったことがわかりましたが、愚かにもメインウィンドウのコンストラクターからfun1()呼び出しました。fun2()したがって、app.exec()待機関数のために呼び出されることはなく、イベントは処理されませんでした。

wait()興味のある人のための実用的な実装は次のとおりです。

void Widget::wait()
{
    static QEventLoop loop;
    connect(this, SIGNAL(done()), &loop, SLOT(quit()));
    loop.exec();
}
于 2013-01-07T13:39:32.463 に答える