2014-10-04 97 views
0

我有兩張要從網絡下載的圖片列表。我使用qnetworkaccessmanager從url獲取圖像。但是在回覆槽中沒有回覆的圖像數據。 :(我無法弄清楚我要去哪裏錯了。如果有人能夠弄明白,這將有助於:)qt:無法從網址讀取圖片

void SyncDialog::getImages() 
{ 
qDebug() << Q_FUNC_INFO << "Invoked"; 

int groupMasterCount = mSyncMasterData.groupMasterList.count(); 
qDebug() << Q_FUNC_INFO << "groupmastercout" << groupMasterCount; 

for (int i = 0 ; i < groupMasterCount; ++i) 
{ 
    GroupMaster groupItem = mSyncMasterData.groupMasterList.at(i); 
    QNetworkReply *reply = 
      mImageGetNwMgr.get(QNetworkRequest(QUrl(groupItem.image))); 
    reply->setProperty("name", QVariant("G_" + groupItem.groupCode)); 

    connect(reply, SIGNAL(readyRead()), this, SLOT(saveImage())); 

    qDebug() << Q_FUNC_INFO << "get call reply" << reply->readAll(); 
    qDebug() << Q_FUNC_INFO << "get url" << groupItem.image; 

    mSyncMasterData.groupMasterList[i].image.clear(); 
#ifdef Q_OS_WIN 
    mSyncMasterData.groupMasterList[i].image = "C:/POS/Images/G_" 
                +groupItem.groupCode; 
#else 
    mSyncMasterData.groupMasterList[i].image = "/mnt/sdcard/POS/Images/G_" 
                +groupItem.groupCode; 
#endif 

} 

int itemMasterCount = mSyncMasterData.itemMasterList.count(); 
qDebug() << Q_FUNC_INFO << "itemmastercout" << itemMasterCount; 

for (int i = 0 ; i < itemMasterCount; ++i) 
{ 
    ItemMaster item = mSyncMasterData.itemMasterList.at(i); 
    QNetworkReply *reply = 
      mImageGetNwMgr.get(QNetworkRequest(QUrl(item.imagePath))); 
    reply->setProperty("name", QVariant("I_" + item.itemCode)); 

    connect(reply, SIGNAL(readyRead()), this, SLOT(saveImage())); 

    qDebug() << Q_FUNC_INFO << "get call reply" << reply->readAll(); 
    qDebug() << Q_FUNC_INFO << "get url" << item.imagePath; 

    mSyncMasterData.itemMasterList[i].imagePath.clear(); 
#ifdef Q_OS_WIN 
    mSyncMasterData.itemMasterList[i].imagePath = "C:/POS/Images/I_" 
                +item.itemCode; 
#else 
    mSyncMasterData.itemMasterList[i].imagePath = "/mnt/sdcard/POS/Images/G_" 
                +item.itemCode; 
#endif 

} 

qDebug() << Q_FUNC_INFO << "Exits"; 
} 

在我的插槽我保存的圖像,但在reply-> readAll給我「」

void SyncDialog::saveImage() 
{ 
qDebug() << Q_FUNC_INFO << "Invoked"; 

QObject *senderObj = sender(); 
QNetworkReply *reply = qobject_cast<QNetworkReply*>(senderObj); 

QImage* img2 = new QImage(); 
img2->loadFromData(reply->readAll()); 
qDebug() << Q_FUNC_INFO << "image nw reply" << reply->readAll(); 
QString imageName = reply->property("name").toString(); 
qDebug() << Q_FUNC_INFO << "imageName" << imageName; 

if(img2->isNull()) 
{ 
    qDebug() << Q_FUNC_INFO << "image is null"; 
    return; 
} 

#ifdef Q_OS_WIN 
img2->save("C:/POS/Images/" + imageName); 
#else 
img2->save("/mnt/sdcard/POS/Images/" + imageName); 
#endif 

qDebug() << Q_FUNC_INFO << "Exits"; 
} 

而且我在日誌中看到「libpng的錯誤:讀取錯誤」和插槽被調用多次...

回答

0

感謝所有,

我解決了這個問題很少改變:)

connect(reply, SIGNAL(finished()), this, SLOT(saveImage())); 

finished()確保從n/w接收完整的圖像數據。

QByteArray  imageData = reply->readAll(); 
QImage   *image  = new QImage(); 

image->loadFromData(imageData); 

reply-> readAll()應該保存爲第一次調用後清除數據後返回它。

image->save("C:/POS/Images/" + imageName + ".png" 

不要忘記指定圖像格式(無論是在文件名或作爲參數)