web-dev-qa-db-ja.com

別の関数に入る前にQt GUIを強制的に更新する

これは自動であるように見えますが、自動ではないようです。私は次のコードを持っています:

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

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

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

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

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

24
zebra

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

#include <QApplication>

また、GUIを更新する場合は、次を呼び出します。

qApp->processEvents();

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

26

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

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

15
Chris

これを追加したかったのは、ここで見た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();

これが誰かを助けることを願っています。

3
Chuck Claunch

関数を定義しています...

_void YourClass::Update_Ui()
{
if(this->isEnabled())
    return;

this->repaint();
qApp->processEvents();
}
_

...このようにし、thisを強制的に更新したいときにuiが無効になっていることを確認して(ユーザーアクションを防止するため)、私にとって最善の解決策でした。

関数内で使用する方法の例(たとえば、時間がかかるスタック処理中):

_this->setEnabled(false);
//Do whatever you want
Update_Ui();
//Do some other stuff
this->setEnabled(true);
_

これにより、ユーザーがuiの相互作用による処理を妨害することはできなくなり(無効になり)、コードでUpdate_Ui();が呼び出されてui全体が更新されるたびに更新されます選択したラベルなどではありません。これはui要素によって発生したシグナルをブロックしないことに注意してください。

0
Kemendil