C++ 隐藏的QMainWindow问题:显示QMessageBox后应用程序崩溃

C++ 隐藏的QMainWindow问题:显示QMessageBox后应用程序崩溃,c++,qt,qt4,qmainwindow,qmessagebox,C++,Qt,Qt4,Qmainwindow,Qmessagebox,需要时,我使用.exit(0)终止应用程序。但我还是不明白出了什么问题 是啊!看来我明白是怎么回事。这是有关方法的信息 QApplication::quitOnLastWindowClosed(bool): 此属性保存最后一个窗口关闭时应用程序是否隐式退出。 默认值为true。如果此属性为true,则当关闭最后一个具有Qt::WA_QuitOnClose属性集的可见的主窗口(即没有父窗口)时,应用程序退出。默认情况下,此属性为除子窗口之外的所有窗口小部件设置。有关Qt::Window对象的详细列

需要时,我使用.exit(0)终止应用程序。但我还是不明白出了什么问题

是啊!看来我明白是怎么回事。这是有关方法的信息

QApplication::quitOnLastWindowClosed(bool)

此属性保存最后一个窗口关闭时应用程序是否隐式退出。 默认值为true。如果此属性为true,则当关闭最后一个具有Qt::WA_QuitOnClose属性集的可见的窗口(即没有父窗口)时,应用程序退出。默认情况下,此属性为除子窗口之外的所有窗口小部件设置。有关Qt::Window对象的详细列表,请参阅Qt::WindowType


QMainWindow隐藏后,没有可见的窗口。当QMessageBox关闭时,应用程序退出

我不确定,但我认为当QMessageBox关闭时,它试图将焦点返回到隐藏的父窗口(您的主窗口)。此操作失败,系统引发异常。

问题似乎如下:当对话框关闭时,应用程序认为没有其他窗口打开(
setQuitOnLastWindowClosed
指可见的顶级窗口),因此退出。不会调用窗口的析构函数,因为您从未删除对象

这将打印出以下消息:

a.setQuitOnLastWindowClosed(false);

或者,您可以将应用程序设置为窗口的父级

只需尝试以下操作-将其放入:

int main(int argc, char* argv[])
{
  QApplication app(argc, argv);
  MainWindow* window = new MainWindow();
  window->show();
  int ret = app.exec();
  delete window;
  return ret;
}
致你的:

...
app.setQuitOnLastWindowClosed(false);
...

这应该有帮助

不幸的是,您不能将应用程序设置为主窗口父窗口,因为父子关系要求父窗口从QWidget派生;QApplication来自QObject而不是QWidget。请尝试此函数:
void MainWindow::showMessageBox(){QMessageBox::information(这是“Hello”,“world!”,QMessageBox::Ok);this->show();}
不带out set
a.setQuitOnLastWindowClosed(false)如果它不会崩溃-这意味着它无法将焦点返回主窗口并引发异常。传递到
QMessageBox::information(…)
NULL
而不是
this
。MessageBox现在没有父项,但应用程序终止。我重新实现了
focusInEvent
-QMessageBox不尝试返回焦点。
...
app.setQuitOnLastWindowClosed(false);
...
int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
...
    app.setQuitOnLastWindowClosed(false);
...
    MainWindow* window = new MainWindow();
    window->show();
    return app.exec();
}