2

在我的应用程序中,我有一个托盘图标,因此我覆盖了 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

4 回答 4

4

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

this->setAttribute(Qt::WA_DeleteOnClose);

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

于 2015-07-28T13:22:13.987 回答
2

这完全取决于您在何处以及如何分配您正在使用的对象。如果您在堆上创建QApplicationand QMainWindow,那么它们将潜伏直到操作系统清理内存。将 a发送close()给 a 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在堆栈上构建。app当调用返回exec()时(通常是发送quit()到) ,它们会以相反的顺序被销毁QCoreApplication::instance()。您甚至可以提供一个简单的清理功能,无需在 UI 的析构函数中添加任何内容。

于 2012-12-21T07:36:26.473 回答
0

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

一旦MainWindow关闭,它就是close,也就是从屏幕上隐藏;

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

希望有所帮助。:)

于 2012-12-21T09:36:35.420 回答
0

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

forever
{
    _runGameLoop();
}

我必须在关闭时MainWindow结束循环

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

当然我必须实施isClosed()

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

void MainWindow::closeEvent(QCloseEvent*)
{
    _isClosed = true;
}
于 2013-10-09T22:48:23.377 回答