您的位置:首页 > 房产 > 建筑 > 建站之星安装说明_工程建设云小程序_发布信息的免费平台_唐山百度提升优化

建站之星安装说明_工程建设云小程序_发布信息的免费平台_唐山百度提升优化

2024/12/27 2:50:47 来源:https://blog.csdn.net/Larry_Yanan/article/details/144365085  浏览:    关键词:建站之星安装说明_工程建设云小程序_发布信息的免费平台_唐山百度提升优化
建站之星安装说明_工程建设云小程序_发布信息的免费平台_唐山百度提升优化

一、前言

作为一个合格的桌面程序,应该具备良好的资源释放的要求,即避免软件退出时,软件界面虽然消失,却假死在后台,只能通过任务管理器强行杀死。这意味着,程序无法通过正常操作进行退出,变成了僵尸程序。
当然,一般情况下,我们是通过右上角关闭按钮的点击,触发软件的退出。但有一种情况例外,就是通过任务栏图标的右键点击,再点击关闭选项,进而触发软件关闭。
但这种情况下,我们真的希望软件直接退出吗?

二、举例

举个实际的例子,我软件打开后,首先是一个欢迎菜单界面,这里能通过点击选项,跳转进入不同的功能界面。这里表述为“界面一”跳转到“界面二”。这时,“界面二”点击关闭按钮时,我希望能跳转回“界面一”,而不是直接退出程序。
这时,通过任务栏右键关闭“界面二”的需求则不是退出程序,也不是简单的关闭“界面二”,而执行具有一定业务需求的代码。

再举一个例子,同样是上述的情况,但“界面二”点击右上角关闭按钮时,其实首先会弹出一个确认弹窗,询问用户“是否想要返回菜单界面?”,用户点击确认后,才会返回上一级菜单。
这时,通过任务栏右键关闭“界面二”的需求则不是关闭界面,而应该通过某种方式,转入到右上角关闭按钮点击触发的槽函数中。

三、解决

而解决这个问题的方法很简单,就是重载这个界面的closeEvent,即

void MainWidget::closeEvent(QCloseEvent *event)
{
}

通过任务栏关闭界面时,会自动触发该界面的closeEvent,这时我们首先要做一个事件忽略的操作,阻止窗口自动关闭析构;再模拟关闭按钮的点击触发,即:

void MainWidget::closeEvent(QCloseEvent *event)
{// 忽略关闭事件(禁用任务栏触发关闭)event->ignore();// 模拟触发关闭按钮ui->btn_close->click();
}

当然,你也可以不触发关闭按钮的点击信号,那就直接没有反应,用户不可以通过任务栏来关闭窗口。

四、说明

有人可能会问,为什么我不会遇到这种情况。
那我首先会说,窗口的close()会不会导致它的析构,是取决于你有没有设置

setAttribute(Qt::WA_DeleteOnClose);

这句代码指的是,当窗口关闭的时候,会自动析构它的全部资源。这对于一些弹窗类来说比较方便。
还有另外一点,并不是所有窗口都会在任务栏显示图标的,当我们设置了以下代码,该窗口就不会在任务栏显示图标了。

this->setWindowFlags(Qt::WindowSystemMenuHint);

问题来了,假设我们有一个“界面一”,它是没有任务栏图标的,还有一个“界面二”,它是有桌面图标的。假设“界面一”是隐藏状态的,我们关闭“界面二”后,该软件在任务栏没有图标了。此时我们会发现,软件会自动退出。
也就是说,当软件没有其他显示窗口时,我们进行关闭窗口的操作,程序会退出。即便关闭窗口时发送了信号,想要创建一个新窗口进行显示……
为了解决这个问题,我们需要在main函数中,设置这行代码,让软件不要以为我们想要退出程序:

//解决没有显示窗口时关闭窗口,程序会退出
QApplication::setQuitOnLastWindowClosed(false);

至此,你应该可以很好的管理窗口的关闭行为了。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com