8
// main.cpp

#include <QApplication>

#include "mainwindow.h"

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

// mainwindow.cpp

#include <QTimer>
#include <QMessageBox>
#include <iostream>

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    this->setCentralWidget(new QWidget());
}

void MainWindow::mousePressEvent(QMouseEvent* event)
{
    this->hide();
    QTimer* timer = new QTimer();
    timer->setInterval(3*1000);
    timer->start();
    connect(timer, SIGNAL(timeout()), this, SLOT(showMessageBox()));
}

void MainWindow::showMessageBox()
{
    QMessageBox::information(this, "Hello,", "world!", QMessageBox::Ok);
}

MainWindow::~MainWindow()
{
    std::cerr << "Destructor called" << std::endl;
}

我单击窗口 - 它隐藏并出现 QMessageBox。我单击“确定”- 应用程序终止,并且未调用 MainWindow 的析构函数。为什么应用程序终止?也许我错过了什么?Qt 4.7.0,Linux。

……哎呀!看起来我找到了我需要的东西。

a.setQuitOnLastWindowClosed(false);

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

是的!看来我明白出了什么问题。这是有关方法的信息

QApplication::quitOnLastWindowClosed(bool)

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

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

4

3 回答 3

3

我不确定,但我认为当 QMessageBox 关闭时,它正试图将焦点返回到他的父级(你的 MainWindow)女巫被隐藏。此操作失败,系统抛出异常。

于 2011-02-25T14:11:11.660 回答
3

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

这应该打印出消息:

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

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

于 2011-02-25T14:27:23.890 回答
2

试试以下 - 把这个:

...
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();
}

这应该有帮助!

于 2020-10-28T15:00:13.080 回答