QT退出不调用主窗口析构函数
QT quit does not call MainWindow destructor
在我的应用程序中,我有一个托盘图标,所以我覆盖了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事件时被调用。
这完全取决于您在哪里以及如何分配您正在使用的对象。如果您在堆上创建了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的析构函数中放入任何东西。
请记住,所有应用程序资源都由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;
}
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 如何从 Gtk::窗口调用派生对象的析构函数
- GUI 和 RAII:通过析构函数或窗口关闭、窗口生命周期进行 Cleenup
- QT退出不调用主窗口析构函数