qt程序在任务栏右键会出现关闭窗口如下图
那么如何捕捉改该事件并重新实现呢
网上介绍了很多方法
1:void closeEvent(QCloseEvent *event); 重写
代码如下
void MainWidget::closeEvent(QCloseEvent *event)
{
// 忽略关闭事件(禁用任务栏触发关闭)
event->ignore();
// 模拟触发关闭按钮
ui->btn_close->click();
}
有人可能会问,为什么我不会遇到这种情况。那我首先会说,窗口的close()会不会导致它的析构,是取决于你有没有设置
setAttribute(Qt::WA_DeleteOnClose);
这句代码指的是,当窗口关闭的时候,会自动析构它的全部资源。这对于一些弹窗类来说比较方便。还有另外一点,并不是所有窗口都会在任务栏显示图标的,当我们设置了以下代码,该窗口就不会在任务栏显示图标了。
this->setWindowFlags(Qt::WindowSystemMenuHint);
问题来了,假设我们有一个“界面一”,它是没有任务栏图标的,还有一个“界面二”,它是有桌面图标的。假设“界面一”是隐藏状态的,我们关闭“界面二”后,该软件在任务栏没有图标了。此时我们会发现,软件会自动退出。
也就是说,当软件没有其他显示窗口时,我们进行关闭窗口的操作,程序会退出。即便关闭窗口时发送了信号,想要创建一个新窗口进行显示……
为了解决这个问题,我们需要在main函数中,设置这行代码,让软件不要以为我们想要退出程序:
//解决没有显示窗口时关闭窗口,程序会退出
QApplication::setQuitOnLastWindowClosed(false);
可以实现,但是普通的退出也是走该接口,导致不是预期的结果
2:重写bool nativeEvent(const QByteArray &eventType, void *message, long *result); 完美解决
代码如下
bool nativeEvent(const QByteArray &eventType, void *message, long *result);
bool ivmsClient::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
MSG *msg = (MSG *)message;
if (msg->message == WM_SYSCOMMAND)
{
if (SC_CLOSE == msg->wParam)//禁止任务栏"关闭窗口"
{
添加自己的代码,比如提示等等
//OnActionUserClose();
return true;
}
}
return QMainWindow::nativeEvent(eventType, message, result);
}
是自己想要的结果
好了。。。完美!!!