2011-06-08 91 views
1

我想下载1张图片并将其保存。这是我到目前为止:qt - 如何通过http下载和保存图像?

QCoreApplication a(argc, argv); 

    QNetworkAccessManager *manager = new QNetworkAccessManager(); 

    QNetworkReply *img = manager->get(QNetworkRequest(QUrl("http://placekitten.com/200/300"))); 

    QImage* img2 = new QImage(); 
    img2->save(img->readAll(), "omg2.png"); 

但是id不起作用,请帮忙!

编辑: 那也不要工作,我得到 “糟糕” 控制台:

QNetworkAccessManager *manager = new QNetworkAccessManager(); 
    //connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*))); 

    QNetworkReply *img = manager->get(QNetworkRequest(QUrl("http://placekitten.com/200/300"))); 

    QImage* img2 = new QImage(); 
    img2->loadFromData(img->readAll()); 

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

    img2->save("omg2.png"); 

编辑: 现在我得到奇怪的错误与vtable,后qmake错误仍然存​​在:

#include <QtCore/QCoreApplication> 
#include <QNetworkAccessManager> 
#include <QtNetwork> 
#include <QImage> 
#include <QPixmap> 
#include <iostream> 


class omg : public QObject{ 

    Q_OBJECT 

    public: 
     void start(){ 


      QNetworkAccessManager *manager = new QNetworkAccessManager(); 
      connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); 

      manager->get(QNetworkRequest(QUrl("http://placekitten.com/200/300"))); 
     } 


    public slots: 
     void replyFinished(QNetworkReply* reply) 
     { 
      //Check for errors first 
      QImage* img2 = new QImage(); 
      img2->loadFromData(reply->readAll()); 

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

      img2->save("omg2.png"); 
     } 


}; 

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

    omg *o = new omg(); 
    o->start(); 

    return a.exec(); 
} 
+0

什么不具体工作? – AJG85 2011-06-08 18:35:30

+0

我没有在任何文件夹中获取图像(项目文件夹或调试/发布) – aaaomg 2011-06-08 18:39:00

+0

您正在泄漏omg的内存......否则不会看到vtable错误,您可能需要为omg实现虚拟析构函数。 – AJG85 2011-06-08 20:23:10

回答

5

甚至在发出Http请求之前,您正在尝试从QNetworkReply读取数据,更不用说完成了。

NetworkAccessManager *manager = new QNetworkAccessManager(); 
connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*))); 

manager->get(QNetworkRequest(QUrl("http://placekitten.com/200/300"))); 

... 
/*Define slot and read data from QNetworkreply*/ 
void finished(QNetworkReply* reply) 
{ 
    //Check for errors first 
    QImage* img2 = new QImage(); 
    img2->loadFromData(reply->readAll()); 

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

    img2->save("omg2.png"); 
} 
+0

你能帮我多一点吗?当我把整个代码放在类中时,我得到:'Object :: connect:没有这样的插槽QObject :: rfinished(QNetworkReply *)in main.cpp:17' – aaaomg 2011-06-08 19:06:36

+0

你必须先创建一个QObject的子类。然后把这个代码放在那个类中。阅读有关信号和插槽这里http://doc.qt.nokia.com/4.7/signalsandslots.html#signals-and-slots – Abhijith 2011-06-08 19:32:35

+0

Thx,但我现在有另一个与Vtable的错误...请看看我最后编辑! – aaaomg 2011-06-08 19:54:25