2017-09-11 3 views
0

================================ =======メインスレッドによってQProgressBarがブロックされていますか?

QProgressBar* pbar = new QProgressBar(this); 
pbar->setMinimum(0); 
pbar->setMaximum(0); 
pbar->show(); 
for (int i = 0; i < 10000; i++) { 
    qDebug() << "=====flag1======"; 
} 
pbar->close(); 

==================================== ===========================

qDebug()メッセージが表示されても、ProgressBarの表示がビジーになりますが、効果がない場合、QProgressBarがブロックされ、ループが終了すると閉じます。

誰もこの問題を解決する方法を知っていますか?ありがとうございました!

+2

あなたの 'for'ループで' pbar-> setValue(i) 'を呼び出すべきではありませんか?また、プログレスバーの最大値を最小値以上に設定する必要があります。これらはコード内では両方ともゼロです。 – vahancho

+0

これは役に立ちます:[メインスレッドがビジー状態のときにQtを動作させる方法](https://stackoverflow.com/questions/1386043/how-to-make-qt-work-when-main-thread-is -Busy) – Simon

+0

私はあなたが意味することを知っていますが、私は正確な進歩の価値を望んでいません、私はちょうどループ中にビジーを表示したいです –

答えて

2

はいGUIがブロックされています.10,000と多くの時間がかかるためです。 QThreadを使用http://doc.qt.io/qt-4.8/qthread.html

void My_Thread::run() { 
    for (int i = 0; i < 1e4; i++) { 
     if (i % 100 == 0) { 
      emit UpdateProgressBar(i); 
     } 
    } 
} 



//In Your SLOT 
void MainWindow::UpdateProgressbar(int value) { 
    ui->progressbar->setValue(value); 
} 
+0

ここで 'QThread'の使用は大きな過度です。 –

1

メインスレッドは、UIが表示される前にループでロックされ、ループが終了した直後にUIが更新されます。 進捗バーを表示したい場合は、QApplication :: processEvents();を追加できます。ループ内。それは最善の解決策ではありませんが、うまくいくでしょう。

1

ウィジェットを表示するには、イベントループを処理する必要があります。 メインスレッドを完全に制御できるので、イベントループは、QProgressBarを表示および更新するイベントを処理できません。

クイックであるが、治療がループに追加されている場合、修正する方法の1つは、イベントループを処理するQApplication::processEvents();です。 また、bar->setValue(i);に電話する必要があります。

適切な方法は、信号とスロットを使用している非同期プログラミングです。あなたは実際の問題についての詳細を提供していないので、良い解決策を提供することはできません。

関連する問題