东莞模块网站建设方案,人像摄影网站十大排名,网站不收录排名会降吗,做兼职哪个网站比较好一、前言
作为一个合格的桌面程序#xff0c;应该具备良好的资源释放的要求#xff0c;即避免软件退出时#xff0c;软件界面虽然消失#xff0c;却假死在后台#xff0c;只能通过任务管理器强行杀死。这意味着#xff0c;程序无法通过正常操作进行退出#xff0c;变成…一、前言
作为一个合格的桌面程序应该具备良好的资源释放的要求即避免软件退出时软件界面虽然消失却假死在后台只能通过任务管理器强行杀死。这意味着程序无法通过正常操作进行退出变成了僵尸程序。 当然一般情况下我们是通过右上角关闭按钮的点击触发软件的退出。但有一种情况例外就是通过任务栏图标的右键点击再点击关闭选项进而触发软件关闭。 但这种情况下我们真的希望软件直接退出吗
二、举例
举个实际的例子我软件打开后首先是一个欢迎菜单界面这里能通过点击选项跳转进入不同的功能界面。这里表述为“界面一”跳转到“界面二”。这时“界面二”点击关闭按钮时我希望能跳转回“界面一”而不是直接退出程序。 这时通过任务栏右键关闭“界面二”的需求则不是退出程序也不是简单的关闭“界面二”而执行具有一定业务需求的代码。
再举一个例子同样是上述的情况但“界面二”点击右上角关闭按钮时其实首先会弹出一个确认弹窗询问用户“是否想要返回菜单界面”用户点击确认后才会返回上一级菜单。 这时通过任务栏右键关闭“界面二”的需求则不是关闭界面而应该通过某种方式转入到右上角关闭按钮点击触发的槽函数中。
三、解决
而解决这个问题的方法很简单就是重载这个界面的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);至此你应该可以很好的管理窗口的关闭行为了。