2014-10-04 101 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" 

不要忘记指定图像格式(无论是在文件名或作为参数)