2013-05-05 93 views
5

多くの計算をした後に私のプログラムにプッシュボタンがあります。私はプログラムがクラッシュすることを許可しないように計算が実行されているが、私の方法はうまくいかなかったこの時間に無効にしたい。 setEnabledQT - プッシュボタンを無効にする方法

void MainWindow::on_pushButton_clicked() 
{  
ui->pushButton->setEnabled(false); 

for() { CALCULATION } 

ui->pushButton->setEnabled(true); 
} 

機能(偽);はプッシュボタンをディライトすることはできません。何度もクリックすることができます。

+0

setEnabled()は動作する必要があります – Blood

+1

がテスト済みです。これは私のために働く。 – gongzhitaao

答えて

4

このコードの問題は、メッセージループの設計にあります。 1つのメッセージ(この場合はボタンがクリックされたハンドラ)を処理している間は、状態への変更を反映するためにウィジェットを再ペイントするメッセージを含め、他のメッセージは処理されません。今、あなたの関数では、ボタンを無効にして、更新する前に再度有効にします。

長時間の計算をUIメッセージハンドラとすることは、UI全体をロックするため、悪い考えです。代わりに、ワーカースレッドのような非同期モデルを使用するか、タイマーを使用して計算をステップごとに実行します。その後、ボタンが無効になっているのを見ることもできます。

7

計算がメインスレッドで行われるため、計算が完了するまでuiがブロックされます。 uiは計算中にリフレッシュされず、計算の最後にボタンを戻します。したがって、計算中にuiに変化はありません。

+0

計算を開始する前に、どのように更新することができますか? –

関連する問題