2012-09-13 4 views
20

これは自動であるようですが、明らかにそうではありません。別の関数を入力する前に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(); 

何が起こっているGUIには、以下の機能が完了するまで、ハングしているようだ、と私はeventaullyだけ「完成」を参照してくださいと私は"Test1...",を見たことがないということです:私は、次のコードがあります。

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

+2

あなたは 'repaint()'や 'update()'のようなものを試しましたか? – Derek

答えて

24

あなたはあなたのコードを入力する前にイベントキューを処理することができます。

#include <QApplication> 

GUIを更新する場合は、

qApp->processEvents(); 

あなたの長い実行中のプロセスは、あなたのGUIの応答性感じるように、今してその関数を呼び出すようにすると良いでしょうことに注意してください。

+2

これは間違いなく動作しますが、私は通常、あなたのコードが再入可能でない場合、予期しない問題を引き起こす可能性があるため、 'processEvents'への呼び出しに対して助言を試みます。 – Chris

14

この時間内にGUIが応答しなくても構わない場合は、my_label->repaint()への呼び出しがこのトリックを行います。 Qtはあなたがイベントループに出かけるまで自動的に何もすることはできません。

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

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(); 

これは誰かを助けることを望みます。

+0

'self.progress.setVisible(False)'の後に 'self.repaint()'が私のケースで動作します – Winand

+0

ああ、同じです。私は彼らの両方が働くことが必要でした。 'processEvents'は自動的に全てを再描画すると思うでしょう。 –

関連する問題