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掉,并删除掉replyif (weakPtr.isNull()) {reply -> deleteLater();return;}//这里导致崩溃的语句也就不会执行了this -> label -> setText("aaa");
});