QT退出不会调用MainWindow析构函数

时间:2012-12-21 06:55:40

标签: c++ qt

在我的应用程序中,我有一个托盘图标,所以我覆盖了closeEvent,以便在某些事情发生时应用程序“最小化”。但是,我确实希望在按下退出时,应用程序将完全退出。但是,在重写closeEvent并调用函数quit()之后,它似乎绕过了MainWindow析构函数,在那里我有一些代码。 我在closeEvent中缺少什么来正确关闭应用程序,以便调用MainWindow的析构函数,就像没有覆盖closeEvent一样?

我尝试过使用

 QMainWindow::closeEvent(event);

以及其他一些事情,但绝不会调用析构函数。

我的近距离事件实施是:

void MainWindow::closeEvent(QCloseEvent * event)
{
    if(m_closeCompletely == false)
    {
        if (trayIcon->isVisible())
        {
            QMessageBox::information(this, tr("Hello"),
                                     tr("The program will keep running in the "
                                        "system tray. To terminate the program, "
                                        "choose <b>Quit</b> in the context menu "
                                        "of the system tray entry."));
        }
    }
    else
    {
        event->accept();
    }
}

4 个答案:

答案 0 :(得分:3)

需要设置WA_DeleteOnClose属性以在close事件上调用析构函数,否则窗口小部件或窗口只是从视图中隐藏。将以下内容添加到类构造函数中:

this->setAttribute(Qt::WA_DeleteOnClose);

这将导致在关闭事件上调用析构函数。

答案 1 :(得分:2)

这一切都取决于您分配所用对象的位置和方式。如果在堆上创建QApplicationQMainWindow,那么它们将会潜伏,直到操作系统清理内存。将close()发送到QWidget(并且QMainWindow为1)只会close将其隐藏在用户之外。您可以稍后show()close()不会破坏它。

您可以使用以下内容:

int main(int argc, char* argv[]) {

   QApplication app(argc, argv);

   MyMainWindow mw;
   mw.show();

   int rc = app.exec();

   // optional: do_cleanup();

   return rc;
}

appmw构建在堆栈上。当app来自exec()来电时(通常是您将quit()发送到QCoreApplication::instance()时),它们将以相反的顺序被破坏。您甚至可以提供普通清理功能,无需在UI的析构函数中添加内容。

答案 2 :(得分:0)

请记住,所有应用资源都由QApplication保留;

关闭MainWindow后,它只是close,也就是隐藏在屏幕上;

我想知道你为什么要破坏你的MainWindow,似乎你已经制作了一个系统托盘,所以我的建议只是隐藏 MainWindow但是到析构函数,因为有一个系统托盘,你可能想点击它来显示MainWindow

希望能帮到你。 :)

答案 3 :(得分:0)

我遇到了同样的问题,因为我正在运行一个永远不允许应用程序关闭的无限循环。

forever
{
    _runGameLoop();
}

我必须在MainWindow关闭

时结束循环
while(!M->isClosed())
{
    _runGameLoop();
}

当然,我必须实施isClosed()

bool MainWindow::isClosed()
{
    return _isClosed;
}

void MainWindow::closeEvent(QCloseEvent*)
{
    _isClosed = true;
}