2011-06-08 49 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