Qt - 在主窗口创建之前显示非模态对话框

3
我一直在努力实现以下需求:在创建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中均无法在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更新它似乎必须手动完成。


感觉你需要创建一个线程并将对话框对象移动到该线程中。一旦主窗口被创建,你可以向线程发送一个信号来使其退出。 - seleciii44
可能是有可能的,但是Trap给了我一个好的解决方案,所以我选择了它。不过还是谢谢你! - Roukira
1个回答

3

谢谢,我之前不知道这个类,现在我会去看看! - Roukira
谢谢,这正是我所寻找的!我已经更新了主贴,加入了新代码,以供其他人参考。 - Roukira
登录表单怎么样?算吗? - greendino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接