关于本节内容的几个问题(见代码中的注释)

关于本节内容的几个问题(见代码中的注释)

老师好,根据老师上课讲解的内容,我进行了实现,在实现的过程中有三处地方不太明白,已经在代码中对应的位置标注出,还请老师指点!谢谢老师!

#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()
{
	
}

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

问题1:httpAccess中的Get方法,在接受到QNetworkReply完成的事件后,将得到的数据通过emit发生给httpAccess的finished事件,这时完成了对lambda表达式的参数传递;

问题2:signals是不需要实现的,适当时候emit发送消息就可以;

问题3:reply失效问题是有点经验的问题,网络本身是个不太稳定的东西,有可能因为网络、异步或内存管理等问题导致对象失效, 所以这里先对reply做了一个深拷贝。

  • 李谌 提问者 #1

    对于问题3,是不是可以认为,把不太稳定的对象作为connect的sender时,为了保险起见,我们一般会使用深拷贝呢?

    2023-08-24 09:14:33
  • quickzhao 回复 提问者 李谌 #2

    是的,可以这么理解。

    2023-08-24 09:19:27
  • 李谌 提问者 回复 quickzhao #3

    谢谢老师~在完成这个项目的时候,我发现当connect函数存在时,程序的执行并不保证是顺序的,这是由于Qt的事件循环机制导致的吗?咱们后面会讲到这个原理嘛?

    2023-08-24 09:25:34
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
C++中高级工程师
  • 参与学习       113    人

无论你在哪个C++领域,越早提升高阶能力,职业发展越好 以工程实践驱动教学,全方位提升“内功,思维,设计,技术”能力 简历指导+1V1答疑+直播答疑等专属服务保障,学习无忧

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师