Qt中点击关闭任务栏窗口而不析构窗口的实现方法

当在Qt中,设置窗口属性后,点击任务栏的X会触发closeEvent。默认不会析构窗口,但可以设置Qt::WA_DeleteOnClose使其析构。通常,关闭仅隐藏窗口而非析构。通过重载closeEvent,忽略QCloseEvent并自定义逻辑(如停止功能和隐藏窗口),可以实现不析构的关闭操作。资源释放应在析构函数或自定义函数中处理。
摘要由CSDN通过智能技术生成

常见的,桌面程序弹出一个功能窗口,会显示在任务栏上,例如:
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
如果在任务栏的窗口,点击“X”关闭后,会直接调用这个窗口类重载的closeevent,如果仍由其直接传入基类qwidget里的closeevent,就可能直接析构窗口。参考:

close会隐藏窗体 ,会触发closeEvent,你可以自己重写closeEvent来控制隐藏或不隐藏,或自己的逻辑,但是默认情况下是不会触发窗体的析构函数的;如果需要触发析构函数,需要Qt::WA_DeleteOnClose标志影响窗体在内存中的状态。

如果你窗体是new出来的,系统close后触发窗体析构函数:
方法1:setAttribute(Qt::WA_DeleteOnClose); (如果不是new出来的,使用本方法,close可能会出现异常)
方法2: exec后,执行delete 对象即可;
不论是那种,主窗体关闭时候,都会析构销毁;

而很多情况下,我们所实现的“关闭窗口”只是停止界面功能并隐藏而已,并不是直接析构掉了,这有本质区别。
那怎么实现,点击关闭任务栏窗口而不析构窗口呢,简单来说就是在重载函数中拦截

void ComboWin::closeEvent(QCloseEvent *event)
{
    qDebug()<<"closeEvent";

    event->ignore(); // 忽略关闭事件
    slot_btn_close_click();

//    QWidget::closeEvent(event);
}

slot_btn_close_click();在我的代码里,是界面右上角的一个关闭按钮槽函数,会停止相应的功能并隐藏窗口,但不意味着窗口就析构消失了。有关这个窗口的资源释放一般来说也没必要放到closeevent里面,要不在析构函数中释放,要不自定义的函数释放。
这样特殊处理过后,父类的引用也要在注意清楚,ComboWin->close();的意义也会发生变化,并不会析构接口,应该delete ComboWin;这样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值