QNetworkAccessManager异步请求有时候操作UI控件崩溃问题

出现场景:

在主界面打开一个子窗口

子窗口中使用QNetworkAccessManager发送异步请求后,得到一个QNetworkReply的对象reply,

此时我们绑定reply对象的finished信号,然后在对应的槽函数中解析得到的数据后去更新界面的控件

但是当请求的返回有延迟时,我们关闭这个子窗口后,响应才返回,槽函数才调用,此时去更新控件,控件已经被析构了,就会抛访问冲突的异常,程序崩溃

如何解决:

使用QPointer类,这是个模板类,可以获取所有QObject及其子类对象的地址,持有一个弱引用,

当持有的对象析构时, QPointer类的对象会变为空

模板参数必须是QObject或者其子类

用法如下:

QNetworkAccessManager * mgr = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setUrl(QUrl("www.baidu.com"));

//发送异步请求,得到QNetworkReply的对象
QNetworkReply * reply = mgr -> get(request);

//使用QPointer<Widget>保存当前窗口的地址
QPointer < Widget > weakPtr(this);
connet(reply, & QNetworkReply::finished, this, [ = ]() {
    //槽函数中捕获这个弱引用指针,用=捕获副本
    //当这个窗口销毁时,这个ptr就会变为空,此时直接return掉,并删除掉reply
    if (weakPtr.isNull()) {
        reply -> deleteLater();
        return;
    }

    //这里导致崩溃的语句也就不会执行了
    this -> label -> setText("aaa");
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值