1. 程式人生 > >QT通過URL下載圖片

QT通過URL下載圖片

標頭檔案:

#ifndef DOWNLOADER_H
#define DOWNLOADER_H

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

class Downloader : public QObject {
    Q_OBJECT
public:
    explicit Downloader(QObject *parent = 0) : QObject(parent) { m_isReady = true; }
    virtual ~Downloader() {}

    void downloadFileFromURL(const QString &url, const QString &filePath);

private slots:
    void onDownloadFileComplete(QNetworkReply *reply);

private:
    QFile *m_file;
    bool m_isReady;
};

#endif // DOWNLOADER_H  

原始檔:

#include "download.h"  
#include <QDebug>
#include <QEventLoop>

void Downloader::downloadFileFromURL(const QString &url, const QString &filePath)
{
    if (!m_isReady)
        return;

    m_isReady = false;

    qDebug() << filePath;
    m_file = new QFile();
    m_file->setFileName(filePath);
    m_file->open(QIODevice::WriteOnly);

    if (!m_file->isOpen()) {
       m_isReady = true;
        return;
    }

    QNetworkAccessManager *manager = new QNetworkAccessManager;

    QNetworkRequest request;
    request.setUrl(QUrl(url));

   connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(onDownloadFileComplete(QNetworkReply *)));

   manager->get(request);
}

void Downloader::onDownloadFileComplete(QNetworkReply *reply)
{
    if (!m_file->isWritable()) {
        m_isReady = true;
        return;
    }

    m_file->write(reply->readAll());
    m_file->close();
    m_isReady = true;
}

呼叫方法:

Downloader downloader;

downloader.downloadFileFromURL("https://img3.doubanio.com/view/photo/photo/public/p449668815.jpg","G:/Documents/picture/name.jpg");