Qt 访问服务器上的图片(访问网络图片/网络文件)
Qt 访问本地图片只需要写上相对路径或者绝对路径,例如,设置在 label 上显示图片。
QPixmap pixmap("../images.jpg"); //本处使用的为相对路径
ui->label->setPixmap(pixmap);
如果需要远程访问服务器上的图片那应该怎么办呢?
首先,我们会发现有个东西叫统一资源定位符
URL
,虽然URL 可以直接访问服务器上的音视频,但是 URL 并不能直接访问服务器上的照片,因为在QMediaPlayer
类中设有 URL 地址的访问接口,而图片显示并没有这样的接口。
那如何远程访问服务器上的照片并加以显示呢?
这里就需要用到
HTTP
超文本传输协议了,在客户端利用 HTTP 直接对目标服务器上的图片进行访问,服务器接收到访问信号后,会将所访问的图片以QByteArray
的形式发送来。整个过程只涉及到了客户端的操作,并不需要对服务器做特殊操作(注意:服务器需要开放访问端口,先可以通过浏览器测试访问服务器上照片是否成功,如果不能显示,则还需要设置Tomcat
。反之,正常操作)。
// 在 .h 文件中添加类的前置声明
class QNetworkReply;
class QNetworkAccessManager;
// 声明一个私有对象
QNetworkAccessManager *manager;
// 添加一个私有槽函数
void replyFinished(QNetworkReply *);
// 在 .cpp 文件的构造函数中添加
manager = new QNetworkAccessManager(this);
connect(manager,&QNetworkAccessManager::finished,this,&Widget::replyFinished);
// https和http都能成功访问
manager->get(QNetworkRequest(QUrl("https://photo.16pic.com/00/61/46/16pic_6146879_b.jpg")));
/*
// 这个好像只能使用 https 才能访问成功
manager->get(QNetworkRequest(QUrl("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRJX4Q6fajqQOiZoiSDjIK0VqquECI3HkA51w&usqp=CAU")));
*/
// 在 .cpp 文件中是实现 void replyFinished(QNetworkReply *) 槽函数
void Widget::replyFinished(QNetworkReply * reply){
QPixmap pixmap;
QByteArray pix = reply->readAll();
pixmap.loadFromData(pix);
ui->label->setPixmap(pixmap);
/*
//将图片保存为5.jpg,保不保存看个人需求
QFile *file = new QFile("5.jpg");//这里直接存在默认路径下
file->open(QIODevice::WriteOnly);
file->write(pix);
file->close();//写完后一定要关闭文件,不然会导致图片失真打不开
*/
}