コード内の関数が実行されているときに、メイン ウィンドウにラベルのテキストを設定したいと考えています。ただし、ラベルは関数が終了するまで変更されません。
for (int i = 0; i < files.size(); ++i) {
ui->label->setText(files[i]);
myfoo();
}
コード内の関数が実行されているときに、メイン ウィンドウにラベルのテキストを設定したいと考えています。ただし、ラベルは関数が終了するまで変更されません。
for (int i = 0; i < files.size(); ++i) {
ui->label->setText(files[i]);
myfoo();
}
ラベルが更新されていない理由は、GUI を更新するメイン スレッドが for ループでビジーであり、イベントを処理する時間がないためです。これにより、GUI ウィジェットが再描画されます。
QApplication::processEvents を使用することもできますが、これは理想的ではありません。特に、関数の処理中に多くのイベントが受信される場合はそうです。
これを処理する適切な方法は、別のスレッド (QThread) と、QObject から派生したオブジェクトを作成することです。これは、メッセージをメイン (GUI) スレッドに送信してラベルを更新するときに機能します。
コードを繰り返すのではなく、QThread の適切な使用方法に関するこの記事を読むことをお勧めします。それほど難しいことではありません。
次に、2 番目のスレッドのオブジェクトにある関数を次のように変更します。
for (int i = 0; i < files.size(); ++i)
{
// calling UpdateLabel signal, which connects to an object on the main thread
UpdateLabel(files[i]);
myfoo();
}
Worker クラスからのシグナルが QMainWindow などのメイン スレッド上のオブジェクトのスロットに接続されていると仮定すると、スロット内のテキストを受け取り、ラベルを更新します。
void QMainWindow::UpdateLabel(const QString text)
{
ui->label->setText(text);
}
シグナルを gui スレッドに送信するだけの別のスレッドで for ループを実行し、適切なスロットで label->setText() を呼び出すことができます。(Qt::QueuedConnection を使用)
またはこれを試してください:
for (int i = 0; i < files.size(); ++i) {
ui->label->setText(files[i]);
QApplication::processEvents();
myfoo();
}