Qt 加载图片并展示loading效果

Qt封装网路图片加载显示类

一个基于Qt框架的C++类,用于在一个窗口中显示一张图片,并在加载图片时显示loading效果。以下是对代码的详细解释和注释:

#ifndef IMAGEWITHLOADINGWIDGET_H
#define IMAGEWITHLOADINGWIDGET_H

#include <QtWidgets>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QPixmap>
#include <QVBoxLayout>
#include <QMovie>
#include <QLabel>

class ImageWithLoadingWidget : public QWidget
{
    Q_OBJECT

public:
    ImageWithLoadingWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        // 创建布局和控件
        layout = new QVBoxLayout(this);
        label = new QLabel(this);
        loadingLabel = new QLabel(this);

        // 创建一个QMovie来显示loading效果(使用.gif文件)
        loadingMovie = new QMovie(":/res/loading.gif");
        loadingLabel->setMovie(loadingMovie);

        // 创建进度条
        progressBar = new QProgressBar(this);
        progressBar->setRange(0, 100);
        progressBar->setValue(0);

        // 将控件添加到布局中
        layout->addWidget(label);
        layout->addWidget(loadingLabel);
        layout->addWidget(progressBar);

        // 创建网络访问管理器
        manager = new QNetworkAccessManager(this);

        // 连接finished信号,当网络请求完成时调用onNetworkReply槽函数
        connect(manager, &QNetworkAccessManager::finished, this, &ImageWithLoadingWidget::onNetworkReply);
    }

    // 加载指定URL的图片
    void loadImageFromUrl(const QUrl &url)
    {
        // 启动loading效果
        loadingMovie->start();

        // 发起网络请求
        QNetworkRequest request(url);
        manager->get(request);
    }

private slots:
    // 网络请求完成的槽函数
    void onNetworkReply(QNetworkReply *reply)
    {
        if (reply->error() == QNetworkReply::NoError)
        {
            // 从网络响应中读取图片数据
            QByteArray data = reply->readAll();
            QPixmap pixmap;
            pixmap.loadFromData(data);

            if (!pixmap.isNull())
            {
                // 如果图片加载成功,显示图片并隐藏loading效果
                label->setPixmap(pixmap);
                progressBar->setValue(100);
                loadingLabel->hide();
            }
            else
            {
                // 如果图片加载失败,显示错误信息
                label->setText("Failed to load image");
            }
        }
        else
        {
            // 处理网络错误,显示错误信息
            label->setText("Network error: " + reply->errorString());
        }

        // 释放QNetworkReply对象
        reply->deleteLater();
    }

private:
    QVBoxLayout *layout;
    QLabel *label;
    QLabel *loadingLabel;
    QProgressBar *progressBar;
    QNetworkAccessManager *manager;
    QMovie *loadingMovie;
};

#endif // IMAGEWITHLOADINGWIDGET_H

这个类通过使用Qt的网络访问模块(QNetworkAccessManager)从指定的URL加载图片,并在加载过程中显示loading效果。同时,还使用了布局管理器(QVBoxLayout)来组织控件的布局,以及QProgressBar来显示加载进度。这个类的设计使得在GUI应用程序中轻松地实现带有loading效果的图片加载功能。

调用方式

#include "imagewithloadingwidget.h"
#include <QApplication>
#include <QLocale>
#include <QTranslator>
#include <QString>
#include <QObject>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ImageWithLoadingWidget widget; widget.show();
    widget.loadImageFromUrl(QUrl("https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"));
    return a.exec();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

telllong

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

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

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

打赏作者

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

抵扣说明:

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

余额充值