【问题标题】:QT quit does not call MainWindow destructorQT quit 不调用 MainWindow 析构函数
【发布时间】:2015-07-28 21:22:13
【问题描述】:

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

【问题讨论】:

标签: c++ qt


【解决方案1】:

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

this->setAttribute(Qt::WA_DeleteOnClose);

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

【讨论】:

    【解决方案2】:

    这完全取决于您分配所使用对象的位置和方式。如果您在堆上创建QApplication 和QMainWindow,那么它们将潜伏,直到操作系统清理内存。将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;
    }
    

    app 和 mw 在堆栈上构造。当app 从exec() 调用返回时(通常当您将quit() 发送到QCoreApplication::instance() 时),它们将以相反的顺序被破坏。您甚至可以提供一个简单的清理功能,无需在 UI 的析构函数中添加任何内容。

    【讨论】:

    • 它们都是在结构中构造的。也许我应该采纳你的建议,避免使用解构函数。
    【解决方案3】:

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

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

    我想知道你为什么要析构你的MainWindow,看来你已经做了一个系统托盘条目,所以我的建议只是隐藏 MainWindow 而析构函数,因为有一个系统托盘,您可能需要单击它以显示MainWindow。

    希望能提供帮助。 :)

    【讨论】:

      【解决方案4】:

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

      forever
      {
          _runGameLoop();
      }
      

      MainWindow 关闭时我必须结束循环

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

      当然我必须实现isClosed()

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

      【讨论】:

        猜你喜欢
        • 2010-12-01
        • 2014-05-18
        • 2011-10-28
        • 1970-01-01
        • 2015-03-29
        • 2015-02-21
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        相关资源
        最近更新 更多