利用Qt并行抓去网络图片(https)

这个项目是一个简单的Github图床客户端,利用Qt的QNetworkAccessManager进行网络请求,实现图片的并行下载。当图片不是gif格式时,直接缩放;如果是gif,则先保存到缓冲区,再读取并缩放。代码中通过QNetworkRequest设置了跟随重定向,并使用QEventLoop处理网络请求完成后的回调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用Qt并行抓去网络图片(https)

项目介绍:一个简易的Github图床客户端

项目仓库:GithubImageHost


利用 QNetworkAccessManager 可以直接获取网络请求


void GitHubImageHost::DownloadImage(GHImage &gh_image)
{
    if (gh_image.pix.isNull()) {

        auto reply = NetworkAccess::Request(QUrl(gh_image.download_url));

        if (!gh_image.html_url.right(5).contains("gif")) {
            gh_image.pix = QImage::fromData(reply.data).scaled(img_size_, Qt::KeepAspectRatio, Qt::SmoothTransformation);
        } else {
            QBuffer buffer;
            buffer.open(QFile::WriteOnly);
            buffer.write(reply.data);
            buffer.close();
            QImageReader reader(&buffer);
            gh_image.pix = reader.read().scaled(img_size_, Qt::KeepAspectRatio, Qt::SmoothTransformation);
        }
    }
}


QNetworkRequest NetworkAccess::NetworkRequest(const QUrl & url)
{
    QNetworkRequest request(url);
    request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
    return request;
}

NetworkReply NetworkAccess::Request(const QUrl & url)
{
    return Request(url, RawHeaderPairs());
}

NetworkReply NetworkAccess::Request(const QUrl & url, const RawHeaderPairs & raw_header)
{
    return SendRequest(url, raw_header, "GET", QByteArray());
}

NetworkReply NetworkAccess::SendRequest(
  const QUrl & url,
  const RawHeaderPairs & header,
  const QByteArray & action,
  const QByteArray & data)
{
    QEventLoop loop;

    NetworkReply reply;
    if (!url.isValid()) {
        return reply;
    }
    QNetworkAccessManager net_access_mgr;
    connect(&net_access_mgr, &QNetworkAccessManager::finished,
            [=, &reply, &loop](QNetworkReply * p_reply) {
                HandleReply(p_reply, reply);
                loop.quit();
            });
    auto request(NetworkRequest(url));
    for (const auto & header : header) {
        request.setRawHeader(header.first, header.second);
    }
    net_access_mgr.sendCustomRequest(request, action, data);

    loop.exec();

    return reply;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Beyond欣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值