QT 禁用任务栏关闭窗口

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);
}

是自己想要的结果

好了。。。完美!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风逐流wrx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值