0

show イベントで QMessageBox を表示する QWidget があります。QWidget の showEvent 関数をオーバーライドしました。問題は、メッセージ ボックスが最初に表示され、残りのウィジェットが後で表示されることです。この問題を解決するにはどうすればよいですか?

void InstallScreen::showEvent( QShowEvent *s )
{ 
   QMessageBox::about( m_main, "One Click Installer", 
          QString( "The following repositories will be added \n %1" ).arg( repoList ) ); 
   QMessageBox::about( m_main, "One Click Installer", 
          QString( "The following packages will be installed \n %1" ).arg( packList ) ); 
} 
4

1 に答える 1

2

遅延呼び出しを使用してウィジェットを表示します。たとえば、ウィジェット表示コードをスロットに配置し、0 秒の遅延で QTimer::singleShot を呼び出します。

これにより、showEvent が完全に処理され、ウィジェットを表示するにメインループで再描画イベントがスケジュールされます。これにより、ウィジェットとメッセージボックスが互いに独立して表示/描画/再描画されます。

protected:
void MyWidget::showEvent(...) {
     ...
     QTimer::singleShot(0, this, SLOT(showMessageBox());
}

private slots:
void MyWidget::showMessageBox() {
     QMessageBox::information(...); // or whatever
}

(何らかの理由で) 追加のマージンが必要な場合は、タイマーの遅延を 50 または 100 ミリ秒に設定します。

于 2012-07-19T06:36:57.700 に答える