1

我正在尝试下载 Blackberry Cascades、C++、QT 中的图像。

我基本上使用的是这样的代码:

void MyClass::download() {

    QUrl url(imagePath);
    QNetworkRequest request(url);
    Q_ASSERT(connect(networkAccessManager_, SIGNAL(finished(QNetworkReply *)), this, SLOT(saveImage(QNetworkReply *))));

    networkAccessManager_->get(request);

}

void MyClass::saveImage(QNetworkReply *) {
    QByteArray imageData = reply->readAll();

    if (reply->error() != QNetworkReply::NoError) {
        qDebug() << "an error occured downloading the image";
        return;
    }

    qDebug() << imageData;
    //...

当我这样做时,imageData 只包含:“ÿÃ~ÿÃ,而不是我下载的图像的全部内容。

有人可以向我解释一下吗?我怎样才能做到这一点?

4

3 回答 3

3

它采用 QByteArray 形式,这就是它显示的原因。只需将它传递给 Image 对象的构造函数,如下所示:

Image image = Image(reply->readAll());
imageView->setImage(image);

它应该工作。如果没有,Image 将太大而无法放入 ImageView。级联 ImageView 可以处理的图像的最大尺寸为 2048。因此您可能必须使用 ImageData 类将大图像复制到级联 ImageView 中。

也尝试从这个url加载图像 它适用于这个url而不使用 ImageData 类

于 2012-10-19T10:48:49.617 回答
0

您可能想检查 QNetworkReply 是否将您重定向到实际图像。如果是,您将收到一个新的 QUrl,它将用于获取新请求。查看QNetworkRequest::Attributes的文档

void MyClass::saveImage(QNetworkReply *reply) {
    QUrl redirect = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
    if( redirect.isValid() ) {
        QNetworkRequest request(redirect);
        networkAccessManager_->get(request);
    }
    else {
        QByteArray imageData = reply->readAll();

        if (reply->error() != QNetworkReply::NoError) {
            qDebug() << "an error occured downloading the image";
            return;
        }

        qDebug() << imageData;
    }
}
于 2012-10-18T21:03:02.820 回答
0

实际上我认为图像正在下载。我以为它只是下载了几个字节,但实际上它不仅仅是几个字节 - 这就是为什么在使用 qDebug 打印出来时没有显示结束引号的原因,(整个图像在一行上)。

于 2012-10-24T20:04:30.033 回答