Qt | 显示网络图片 QNetworkAccessManager
环境: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。
- 点赞
- 收藏
- 关注作者
评论(0)