我一直在努力实现以下需求:在创建MainWindow之前,我想在一个窗口中显示一个QWidget或QDialog,但我不能使用exec(),因为它会进入其循环并且在我接受或拒绝对话框之前不会创建我的MainWindow。
我这么做的原因是,在MainWindow构建自身时,我想要显示信息的小部件。我不希望在MainWindow出现后保留此额外的窗口。
我认为问题在于当调用a.exec()时,主窗口已经被创建,并且在a.exec()之前窗口不会显示出来。我找到的解决方案是改用QDialog并调用exec(),但这会阻塞其他代码,而我不希望发生这种情况。
代码:
这是我迄今为止尝试过的方法:
更新:感谢Trap的帮助,以下是我如何做到的:
我这么做的原因是,在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中均无法在MainWindow之前显示。
- 使用start.exec()可以实现我想要的效果,但它是模态的,我无法通过SetModal(false)或setWindowModality(Qt:NonModal)使其非模态。
- 我还尝试使用start.exec()并尝试重新实现accepted()和exec(),以便它在出现时自动调用accepted(),但它仍然会关闭窗口。
更新:感谢Trap的帮助,以下是我如何做到的:
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();
}
我的唯一担忧是我在我的小部件中使用了一个Gif,使用QMovie更新它似乎必须手动完成。