在我的应用程序中,我有一个托盘图标,所以我覆盖了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();
}
}
答案 0 :(得分:3)
需要设置WA_DeleteOnClose属性以在close事件上调用析构函数,否则窗口小部件或窗口只是从视图中隐藏。将以下内容添加到类构造函数中:
this->setAttribute(Qt::WA_DeleteOnClose);
这将导致在关闭事件上调用析构函数。
答案 1 :(得分:2)
这一切都取决于您分配所用对象的位置和方式。如果在堆上创建QApplication
和QMainWindow
,那么它们将会潜伏,直到操作系统清理内存。将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;
}
app
和mw
构建在堆栈上。当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;
}