关于在QPushButton的点击信号槽函数中创建子窗口的思考

文章讲述了如何在点击槽函数中创建子Widget以避免内存泄漏,首先提到直接创建会因未释放资源导致内存问题。然后介绍了使用Qt::WA_DeleteOnClose属性,但会影响效率。最后,作者提出使用静态局部变量来确保只创建一个Widget,有效解决了内存管理和效率问题。
摘要由CSDN通过智能技术生成

需求是这样的,在点击的槽函数中创建一个子Widget并show出来,一开始代码如下

void LeftWidget::createPtn_clicked(){
    LeftWidgetCreateWidget *_createWidget = new LeftWidgetCreateWidget(this->parentWidget()->parentWidget());
    _createWidget->show();
}

这样是肯定不行的,因为每一次点击按钮都会创建出一个新的Widget,而widget的close并不会使其释放资源,只是隐藏了这个widget的窗口,运行后期大量的widget会严重占用内存资源。

比较普遍的解决方法是使用setAttribute(Qt::WA_DeleteOnClose, true); 

setAttribute(Qt::WA_DeleteOnClose, true); 

为widget设置close就释放资源的额属性。

但是这样做会导致widget频繁的释放和建立,也影响效率,于是我最终采用了如下方案

void LeftWidget::createPtn_clicked(){
    static LeftWidgetCreateWidget *_createWidget = new LeftWidgetCreateWidget(this->parentWidget()->parentWidget());
    _createWidget->show();
}

在声明前添加了一个static,使指针成为局部静态变量,从而无论用户点击多少次只有一个子widget隐藏在后台。下面测试一下效果,在_createWidget的构造函数中输出“创建”,并多次点击按钮触发函数

发现永远只创建一次!成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值