QT开发中文网

QT C++ 如何显示http链接的图片,不下载该图片到本地,可以存储在缓存李

在不将图片下载到本地的情况下,可以使用Qt的QNetworkAccessManager和QNetworkRequest类从网络中获取图片,并将其存储在内存中或者缓存中。具体步骤如下:

  1. 创建一个QNetworkAccessManager对象,用于发送请求并接收响应。

  2. 构造一个包含图片URL的QNetworkRequest对象,并调用setHeader()函数设置User-Agent头部,以模拟浏览器行为。

  3. 发送网络请求,并通过连接QNetworkAccessManager::finished信号与槽函数处理响应结果。

  4. 在槽函数中,检查响应是否成功返回,并获取其Content-Type和Content-Length等元数据信息。

  5. 如果Content-Type是图片格式(如image/jpeg、image/png等),则获取响应数据并将其保存在内存中或者缓存中。

  6. 根据内存中或者缓存中的图片数据创建一个QPixmap对象,并将其绘制到指定QWidget上,从而实现显示图片效果。

以下是示例代码:

void MyWidget::displayImage(const QUrl& imageUrl)
{
    QNetworkAccessManager* manager = new QNetworkAccessManager(this);

    QNetworkRequest request(imageUrl);
    request.setHeader(QNetworkRequest::UserAgentHeader, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3");

    QEventLoop loop;
    QObject::connect(manager, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);

    QNetworkReply* reply = manager->get(request);
    loop.exec();

    if (reply->error() == QNetworkReply::NoError) {
        QVariant contentType = reply->header(QNetworkRequest::ContentTypeHeader);
        qint64 contentLength = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong();

        if (contentType.toString().startsWith("image/")) {
            QByteArray data = reply->readAll(); // 获取响应数据
            QPixmap pixmap;
            pixmap.loadFromData(data); // 从内存中或者缓存中加载图片

            QLabel* label = new QLabel(this);
            label->setPixmap(pixmap);
            label->show();
        }
    }

    delete reply;
    delete manager;
}

在实际应用中,需要根据具体需求将获取到的图片数据保存在内存中或者缓存中,以便后续快速读取和显示。可以使用Qt的QCache类来实现缓存功能,也可以使用标准C++库提供的容器(如std::map、std::unordered_map等)来自行实现。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://qt.0voice.com/?id=1955

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?