6

プログラムにプッシュボタンがあり、クリックすると多くの計算が行われます。プログラムがクラッシュしないように計算が実行されている間は無効にしたいのですが、私の方法はうまくいきませんでした。

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

for( ) { CALCULATION }

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

関数setEnabled(false); プッシュボタンを無効にすることはなく、何度でもクリックできます。

4

3 に答える 3

7

計算はメイン スレッドで行われるため、計算が完了するまで UI はブロックされます。UI は計算中に更新されず、計算の最後にボタンを戻します。そのため、計算中に UI に変更はありません。

于 2013-05-05T15:28:20.150 に答える
5

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

長い計算を UI メッセージ ハンドラーで行うのは、UI 全体をロックするため、お勧めできません。代わりに、ワーカー スレッドのような非同期モデルを使用するか、タイマーを使用して段階的に計算を行います。次に、ボタンが無効になっていることも確認できます。

于 2013-05-05T15:26:56.680 に答える