【问题标题】:Qt - Non Modal Dialog before Main Window is createdQt - 创建主窗口之前的非模态对话框
【发布时间】:2023-03-03 08:27:23
【问题描述】:

我一直在努力做到这一点:我想在创建 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(),但它仍然会关闭窗口。

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

更新:感谢 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();
 }

我唯一担心的是,我使用 QMovie 在我的小部件中使用了 Gif,并且显然必须手动更新它。

【问题讨论】:

  • 感觉需要创建一个线程并将对话框对象移动到该线程。创建主窗口后,您可以向线程发送信号以使其退出。
  • 或许有可能,但我 Trap 给了我一个很好的解决方案,所以我就去做了。不过谢谢!

标签: c++ qt show qwidget qdialog


【解决方案1】:

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

【讨论】:

  • 谢谢,我不知道这门课,我现在去看看!
  • 谢谢,这正是我想要的!我用其他人的新代码更新了主帖子。
  • 登录表单怎么样?算不算?
猜你喜欢
  • 2014-08-22
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
相关资源
最近更新 更多