1

QMessageBox を使用して、短い待機間隔をユーザーに通知したいと考えています。

QMessageBox* box(new QMessageBox(QMessageBox::Information,"Parser","Processing " + mFileName));
box->setStandardButtons(QMessageBox::NoButton);
box->setWindowModality(Qt::WindowModal);
box->show();
QApplication::processEvents();

parser.analyseFile(mFileName);

box->hide();
box->deleteLater();
QApplication::processEvents();

この機能には数秒しかかかりません。ボックスは表示されますが、関数が終了する前にアイコンもテキストも表示されません。QApplication::processEvents();ボックスが完全に表示される前に、プログラムの続行が妨げられないのはなぜですか。スレッドに頼らずに目的の動作を実現することは可能ですか?

4

1 に答える 1

1

別のスレッドで処理を行う方が望ましいでしょう。これは、タスクが完了している間、GUI スレッドがマウス イベントの処理やウィンドウのサイズ変更などを自由に行えるようにするためです。そうすれば、GUI が一時的に「フリーズ」することはありません。

ただし、スレッドを生成したくない場合は、analyseFile() 関数内から定期的に processEvents() を呼び出すことができます。これにより、ほぼ同じ動作が得られます。GUI の応答が遅くならないように、少なくとも 50 ミリ秒ごとに呼び出すようにしてください。

2 番目の可能性は、どこかにスロットを追加することです。

void MyClass :: ParseFile()
{
   parser.analyseFile(mFileName);
   box->hide();
   box->deleteLater();
}

...そして、次のように非同期で呼び出します。

QTimer::singleShot(0, this, SLOT(ParseFile()));

...これにより、ParseFile() が実行される前にQMessageBoxの表示を終了するのに十分な時間がウィンドウ システムに与えられる場合と、そうでない場合があります (その場合、遅延引数を 0 から、たとえば 100 ミリ秒に増やすことができます)。それは少しハックですが、うまくいく可能性があります。

于 2013-08-08T23:54:02.747 に答える