Qt - 创建主窗口前的非模态对话框

时间:2018-03-17 16:48:42

标签: c++ qt show qwidget qdialog

我一直在努力做到这一点:我想在创建MainWindow之前在窗口上显示QWidget或QDialog,但我不能使用exec(),因为它将进入其循环并且不会创建我的MainWindow在我接受或拒绝对话之前。

我想要这样做的原因是在MainWindow构建自己时让一个小部件显示信息。一旦MainWindow出现,我不想保留这个额外的窗口。

我认为问题来自这样一个事实:当a.exec()被调用时,主窗口已经被创建,并且窗口不会在a.exec()之前显示。我找到的解决方案是使用QDialog而不是调用exec(),但它会阻止我不希望发生的其余代码。

代码:

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
StartUpDialog start; //this is my custom QDialog, can be a QWidget if necessary.
qDebug() << "starting up!";
MainWindow w;
start.exec(); //I tried show() but it won't show up.
w.startApp(&start); //this function will do some stuff.
w.show();
//I don't want start to stay after mainwindow shows up
return a.exec();
}

这是我到目前为止所尝试的内容:

  • 我在构建MainWindow时尝试创建并显示StartUpDialog,但它无法解决。
  • 使用start.show(),但它不会在主窗口之前显示,无论是QWidget还是QDialog。
  • 使用start.exec(),这就是我想要的,但它是模态的,我无法使用SetModal(false)或setWindowModality(Qt:NonModal)使其成为非模态。
  • 我还尝试使用start.exec()并尝试重新实现accepted()和exec(),以便它一出现就会自动调用accepted(),但它仍会关闭窗口。

希望你能在这个问题上帮助我,谢谢阅读!

更新:解决了陷阱,我就是这样做的:

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
StartUpDialog start;
QSplashScreen *splash = new QSplashScreen();
StartUpWidget *start = new StartUpWidget(splash);
splash->resize(350,380);
start->show();
splash->raise();
splash->show();
qDebug() << "starting up!";
MainWindow w;
w.startApp(start);
w.show();
splash->finish(&w);
start->deleteLater();
splash->deleteLater();
return a.exec();
 }

我唯一关心的是我使用QMovie在我的小部件中使用Gif,并且必须手动完成更新。

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题(在创建主窗口之前显示对话框),您应该查看QSplashScreen类:http://doc.qt.io/qt-5/qsplashscreen.html