qt - 如何通过http下载和保存图像?

aaa*_*omg 6 c++ windows qt

我正在尝试在控制台应用程序中使用 Qt 下载并保存一些图像。这是我到目前为止得到的,(所有代码都在编译,但运行后,它似乎没有进入replyFinished()功能......)

void Test::start()
{
    std::cout << "start1";
    QNetworkAccessManager *manager = new QNetworkAccessManager();
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
    manager->get(QNetworkRequest(QUrl("http://www.exylum.mydevil.net/firefox.jpg")));
}

void Test::replyFinished(QNetworkReply* reply)
{
    std::cout << "st";
    QImage* img2 = new QImage();
    img2->loadFromData(reply->readAll());

    if(img2->isNull())
        std::cout << "oops";

    if(img2->save("omg2.jpg", "JPG"))
        std::cout << "saved";
    else
        std::cout << "dont...";
}
Run Code Online (Sandbox Code Playgroud)

Lwi*_* Ko 0

头文件

#ifndef IMAGEDOWNLOAD_H
#define IMAGEDOWNLOAD_H

#include <QWidget>
#include <QHttp>
#include <QFile>
#include <QUrl>

class ImageDownload : public QWidget
{
    Q_OBJECT
public:
    explicit ImageDownload(QWidget *parent = 0);

private:
    int httpGetId;
    QHttp http;
    QFile myfile;

private slots:
    void httpRequestFinished(int, bool);
    void progress(int,int);
};

#endif // IMAGEDOWNLOAD_H
Run Code Online (Sandbox Code Playgroud)

源文件

#include "imagedownload.h"

ImageDownload::ImageDownload(QWidget *parent) :
    QWidget(parent)
{
    QUrl url("url of image.");

    myfile.setFileName("C:/Qt/imagefilename");
    myfile.open(QIODevice::WriteOnly);

    connect(&http,SIGNAL(requestFinished(int,bool)),this,SLOT(httpRequestFinished(int,bool)));
    connect(&http,SIGNAL(dataReadProgress(int,int)),this,SLOT(progress(int,int)));
    http.setHost(url.host(),QHttp::ConnectionModeHttp,url.port());
    httpGetId = http.get(url.path(),&myfile);
}

void ImageDownload::httpRequestFinished(int id, bool error)
{
    if(id == httpGetId)
    {
        myfile.close();
    }
    if(error)
    {
        qDebug(http.errorString().toLatin1());
    }
}

void ImageDownload::progress(int a, int b)
{
    qDebug(QString::number(a).toLatin1()+" : "+QString::number(b).toLatin1());
}
Run Code Online (Sandbox Code Playgroud)