25

これは自動であるように見えますが、どうやらそうではありません。次のコードがあります。

    ui.my_label->setText("Test 1...");
    ui.my_label->adjustSize();

    processThatTakesAbout30SecondsToFinish(files[0].toStdString());

    ui.my_label->setText("Finished.");
    ui.my_label->adjustSize();

何が起こっているのかというと、次の関数が完了するまで GUI がハングしているように見え"Test1...",、最終的には「Finished.」しか表示されないということです。

その関数に入る前に GUI が更新されていることを確認するにはどうすればよいですか?
ありがとう。

4

4 に答える 4

30

次の場合は、コードを入力する前にイベント キューを処理できるはずです。

#include <QApplication>

そして、GUI を更新したい場合は、; を呼び出します。

qApp->processEvents();

GUI の応答性を高めるために、実行時間の長いプロセスにその関数をときどき呼び出させることをお勧めします。

于 2012-09-13T16:12:13.513 に答える
15

この間、GUIが応答することを気にしない場合は、を呼び出すとうまくいきますmy_label->repaint()。イベントループに屈しない限り、Qtは自動的に何もできません。

応答性を最大限に高めるには、プロセスを別のスレッドで実行し、シグナル/スロット接続(デフォルトではスレッドセーフ)を使用して、処理が完了したときにメインGUIスレッドにシグナルを送信することを検討してください。

于 2012-09-13T16:23:30.913 に答える
3

ここで見た2つの回答の組み合わせが必要だったことを追加したかっただけです。だから私のために働いたのは:

ui.my_label->setText("Test 1...");
ui.my_label->adjustSize();

//! Both of these lines needed
ui.my_label->repaint();
qApp->processEvents();

processThatTakesAbout30SecondsToFinish(files[0].toStdString());

ui.my_label->setText("Finished.");
ui.my_label->adjustSize();

これが誰かに役立つことを願っています。

于 2014-11-13T19:09:43.443 に答える