1

Qt 4.8 を使用しています。

更新する大きな QGraphicsScene があります (新しい QGraphicsObjects を追加するのに 3 秒かかります)。更新が進行中であることをユーザーに示したいと思います。特に、ローディング ホイールを画面に表示し、更新が終了したら削除することを考えました。

ここでの問題は、シーン更新の同じスレッドでホイールを表示してから非表示にする必要があることです。これは次の理由によります。

  • GUI スレッドの外部でグラフィック プロパティを編集することは許可されていません。

  • グラフィックスが関係しているため、計算を「ワーカー スレッド」に移動することはできません。

これにより、ホイールがまったく表示されなくなります。これは、ビューが更新されたときに、ホイールが既に表示されるように設定されており、その後再び表示されないためです。

showWheel();
/*... big computation involving graphics ...*/
hideWheel();
/*... here GUI is updated, thus the wheel doesn't show up...*/

何か私にできることはありますか?

ありがとう

4

2 に答える 2

1

おそらく、計算をトリガーする何らかのイベントがあると思います。これを使用して計算をトリガーする代わりに、scheduleComputation()スロットをトリガーするために使用します。スロットは、次のイベント キューの最後にスロットscheduleComputationを呼び出しshowWheel()てスケジュールできます。その後、スロットは戻ります。doComputation()これにより、イベント ループが実行され、ホイールが表示され、計算が実行されます。計算が終わったら、呼び出しhideWheel()てイベントループに戻ることができます。

このようなもの:

void scheduleComputation()
{
    computeScheduler = new QTimer(this);
    computeScheduler->setInterval(0);
    connect(computeScheduler,SIGNAL(timeout()),this,SLOT(doComputation()));
    showWheel();
}

void doComputation()
{
    //...Computation Here...
    hideWheel();
}

また、UI スレッドを長時間ブロックしないようにすることもお勧めします。これは、長時間実行されるコードを、タイマーによってトリガーできる小さな断片に分割することで実行できます。

于 2013-01-17T17:04:45.597 に答える
0

「大きな計算」の定期的な間隔で、イベント ハンドラーを少しの間実行させることができます。

于 2013-01-17T17:07:22.657 に答える