关于本节内容的几个问题(见代码中的注释)
老师好,根据老师上课讲解的内容,我进行了实现,在实现的过程中有三处地方不太明白,已经在代码中对应的位置标注出,还请老师指点!谢谢老师!
#include <QtCore/QCoreApplication>
#include "HttpAccess.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
HttpAccess httpAccess;
// 问题1:这里lambda表达式是如何通过信号拿到参数data的?
QObject::connect(&httpAccess, &HttpAccess::finished, [&](const QByteArray& data)
{
qDebug() << data;
});
httpAccess.Get(QUrl("http://www.baidu.com"));
return a.exec();
}
#pragma once
#include <QObject>
#include <QtNetwork/QtNetwork>
class HttpAccess : public QObject
{
Q_OBJECT
public:
explicit HttpAccess(QObject *parent = nullptr);
HttpAccess(const HttpAccess& other) = delete;
HttpAccess(const HttpAccess&& other) = delete;
HttpAccess& operator=(const HttpAccess& other) = delete;
HttpAccess& operator=(const HttpAccess&& other) = delete;
virtual ~HttpAccess();
void Get(const QUrl& url);
signals:
// 问题2:这个finished在哪里实现的?
void finished(const QByteArray& data);
private:
QNetworkAccessManager m_manager;
};
#include "HttpAccess.h"
HttpAccess::HttpAccess(QObject* parent) : QObject(parent)
{
}
void HttpAccess::Get(const QUrl& url)
{
const QNetworkRequest request(url);
QNetworkReply* reply = m_manager.get(request);
// 问题3:这里reply为什么会在connect执行完成之前失效?
connect(reply, &QNetworkReply::finished, [=]()
{
if(reply->error() == QNetworkReply::NoError)
{
QByteArray data = reply->readAll();
emit finished(data);
}
});
}
HttpAccess::~HttpAccess()
{
}
13
收起
正在回答
1回答
问题1:httpAccess中的Get方法,在接受到QNetworkReply完成的事件后,将得到的数据通过emit发生给httpAccess的finished事件,这时完成了对lambda表达式的参数传递;
问题2:signals是不需要实现的,适当时候emit发送消息就可以;
问题3:reply失效问题是有点经验的问题,网络本身是个不太稳定的东西,有可能因为网络、异步或内存管理等问题导致对象失效, 所以这里先对reply做了一个深拷贝。
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星