环境:VS2017+Qt5.14.2
1. 添加NetWork模块。
下面是在VS中添加NetWork模块的流程,两个流程,任选一个就可以了。
- 右键项目->选择属性->选择Qt Project Settings->Qt Modules->勾选NetWork
- 点击导航栏Qt VS Tools->选择Qt Project Settings->Qt Modules->勾选NetWork
Qt网络模块提供一些实现OSI 7层网络模型中高层的网络协议,如HTTP、FTP、SNMP等,这些类主要是QNetworkRequest、QNetworkReply、QNetworkAccessManager。
QNetworkAccessManager类用于协调网络操作。在QNetworkRequest发起一个网络请求后,QNetworkAccessManager类负责发送网络请求,创建网络相应。 QNetworkReply类表示网络请求的响应。由QNetworkAccessManager在发送一个网络请求后创建一个网络响应。QNetworkReply提供的信号finished()、readyRead()和downloadProgress()可以检测网络响应的执行情况,执行相应操作。
2. 声明QNetworkAccessManager成员变量。
QNetworkAccessManager m_networkManager;
QNetworkAccessManager 是Qt中的网络访问管理器,主要用来实现Qt中的网络编程。这个类允许应用程序发送网络请求和接收网络应答。
QNetworkAccessManager类通过一个URL地址发起网络协议请求,也保存网络请求的信息,目前支持HTTP、FTP和局部文件URLs的下载或上传。
3. 连接信号槽函数。
connect(&m_networkManager, &QNetworkAccessManager::finished, this, &Myself::OnReplyFinished);
当请求图片资源完成时,会响应QNetworkAccessManager::finished()信号,它的请求是异步的。每当网络应答结束时都会发射这个信号。 函数原型为:void finished(QNetworkReply *reply);
4. 请求图片资源。
QNetworkRequest request;
request.setUrl(QUrl(“http://”));
m_networkManager.get(request);
用get()函数来发送一个网络请求。除了get()函数,管理器还提供了发送HTTP POST请求的post()函数。
5. 槽函数的实现。
void MySelf::OnReplyFinished(QNetworkReply *reply) { if (reply->error() == QNetworkReply::NoError) { QByteArray bytes = reply->readAll(); QPixmap pixmap; pixmap.loadFromData(bytes); //按比例将图片缩放成固定大小 pixmap = pixmap.scaled(100, 100, Qt::KeepAspectRatio, Qt::SmoothTransformation); } reply->deleteLater(); }
注: reply->deleteLater();一定要调用,否则会造成内存泄露
特别:
如果访问Http没有问题,而访问Https时图片获取失败,是因为Https访问需要用到SSL认证,而QT默认是不支持SSL认证的,所以还需要安装OpenSSL库:
1. 打开slproweb.com/products/Wi…网页;
2. 下载安装包;我下载的是: Win64 OpenSSL v1.1.1m Light 安装包,随着时间的推进,这个版本会不断更新的;
3. 安装(exe文件)到本地,并且在安装过程中选择将库安装到OpenSSL的安装目录(/bin)下面。
4. 将 libeay32.dll 和 ssleay32.dll 文件拷贝到Qt中的存放有QtNetwork4.dll和QtNetworkd4.dll的文件目录下。我的路径是 D:\Qt\5.14.2\5.14.2\msvc2017_64\bin。