Qt - 从网站上获取图片

EKKO: / 2024-09-26 / 原文

方法一

在Qt中,你可以使用QNetworkAccessManager来从网站上获取图片。以下是一个简单的例子,展示了如何使用Qt下载图片:

imagedownloader.h

#ifndef IMAGEDOWNLOADER_H
#define IMAGEDOWNLOADER_H

#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QFile>
#include <QObject>

class ImageDownloader : public QObject
{
    Q_OBJECT
public:
    ImageDownloader(QNetworkAccessManager* manager, const QUrl& imageUrl, const QString& savePath): m_manager(manager), m_imageUrl(imageUrl), m_savePath(savePath)
    {
        connect(m_manager, &QNetworkAccessManager::finished, this, &ImageDownloader::onDownloadFinished);
        QNetworkRequest request(m_imageUrl);
        m_manager->get(request);
    }

private slots:
    void onDownloadFinished(QNetworkReply* reply)
    {
        if (reply->error())// 处理错误
        {
            qDebug() << "Download error:" << reply->errorString();
            return;
        }

        QFile file(m_savePath);
        if (!file.open(QIODevice::WriteOnly))
        {
            qDebug() << "Cannot open file for writing";
            return;
        }
        file.write(reply->readAll());
        file.close();
        qDebug() << "Image saved to" << m_savePath;
    }

private:
    QNetworkAccessManager* m_manager;
    QUrl m_imageUrl;
    QString m_savePath;
};

#endif // IMAGEDOWNLOADER_H

main.cpp

//#include "widget.h"

#include <QApplication>
#include "imagedownloader.h"
#include <QSslSocket>
#include <QDebug>


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug()<< QSslSocket::sslLibraryBuildVersionString();

    QNetworkAccessManager manager;
    QUrl imageUrl("https://www.leawo.org/images/7days_prom_en.jpg"); // 替换为实际的图片URL

    QString savePath = "./downloaded_image.jpg"; // 图片将被保存到的路径

    ImageDownloader downloader(&manager, imageUrl, savePath);

    return a.exec();
}

确保你的项目文件.pro包含了网络模块:

QT += network

在这个例子中,ImageDownloader类负责处理图片下载。它使用QNetworkAccessManager发送一个GET请求到指定的URL,并在下载完成时将图片保存到本地文件。你需要提供一个有效的图片URL和想要保存图片的文件名。

运行效果:

 

方法二

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void saveImage(const QString url);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);

    QString strUrl = QString("https://www.leawo.org/images/7days_prom_en.jpg");
    saveImage(strUrl);
}

Widget::~Widget()
{
    delete ui;

}

void Widget::saveImage(const QString url)
{
    QNetworkRequest request(url);
    QNetworkAccessManager *networkManager = new QNetworkAccessManager();
    QNetworkReply *reply = networkManager->get(request);
    QEventLoop eventLoop;
    QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
    eventLoop.exec();
    if(reply->error() == QNetworkReply::NoError)
    {
        QByteArray data = reply->readAll();
        QImage image = QImage::fromData(data);
        image.save("./test1.png");//说明:这里是通过QImage保存图片数据,也可通过QFile来实现。
    }
    else
    {
        qDebug() << reply->errorString();
    }
}

运行结果: