QT退出不调用主窗口析构函数

QT quit does not call MainWindow destructor

本文关键字:窗口 析构函数 调用 退出 QT      更新时间:2023-10-16

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

我试过使用

 QMainWindow::closeEvent(event);

和其他一些东西,但是析构函数永远不会被调用。

我的close事件实现是:

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

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

this->setAttribute(Qt::WA_DeleteOnClose);

这将导致析构函数在close事件时被调用。

这完全取决于您在哪里以及如何分配您正在使用的对象。如果您在堆上创建了QApplicationQMainWindow,那么它们将一直潜伏到操作系统清理内存为止。发送一个close()到一个QWidget (QMainWindow是一个)只会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是在栈上构造的。当appexec()调用返回时(通常是当您将quit()发送给QCoreApplication::instance()时),它们将以相反的顺序被销毁。您甚至可以提供一个简单的清理函数,而不需要在UI的析构函数中放入任何东西。

请记住,所有应用程序资源都由QApplication;

一旦你的MainWindow被关闭,它只是close,又名隐藏从屏幕;

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

希望能有所帮助。:)

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

forever
{
    _runGameLoop();
}

MainWindow关闭时,我必须使循环结束

while(!M->isClosed())
{
    _runGameLoop();
}

当然我必须实现isClosed()

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