【问题标题】:Attempting to download an image in Blackberry Cascades QT, and QML尝试在 Blackberry Cascades QT 和 QML 中下载图像
【发布时间】:2012-10-18 17:45:51
【问题描述】:

我正在尝试下载 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 只包含:“ÿØÿÃ,而不是我下载的图像的全部内容。

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

【问题讨论】:

    标签: c++ qt download qml blackberry-10


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,但我的字节数组仍然得到“ÿØÿÔ,当我尝试将其放入图像时,我收到此编译器错误消息:错误:没有匹配函数调用 'bb::cascades::Image::Image(QByteArray&)'
    • 好的,我猜你正在开发 beta 2 SDK。在该 Image 类中没有接受 QByteArray 作为参数的构造函数。因此,您必须使用该 QByteArray 创建 QImage 然后必须使用 QPainter 和 PixelBufferData 类来操作该 QImage 。我强烈建议您尽快切换到 beta 3 SDK。当我切换时,我遇到了很多问题,因为很多事情都改变了,我的努力都白费了。自 beta 3 以来,甚至 PixelBufferData 类也已被弃用并被 ImageData 类取代。
    • 如果你仍然想让它适用于 beta 2,你可以看看这个教程:supportforums.blackberry.com/t5/Cascades-Development-Knowledge/…
    • 谢谢,但该教程并未显示所有代码 - 以及教程链接:此示例的源代码可以从 Github® 上的 BlackBerry® 项目在此处下载:github.com/blackberry/Cascades-Samples/tree/master/…,得到一个 404 Not Found 错误,除非我可以在其他地方找到它的源代码。
    • 是的,它已被删除,因为这些类现在已弃用。无论如何,幸运的是我有那个示例代码。我已经在下面提到的链接上上传了这里。你可以从那里下载它。 filedropper.com/qimagescratchpad 我没有在设备上运行,因为我有一个带有 beta 3 OS 的设备。但是你可以从中得到一个想法。
    【解决方案2】:

    您可能需要检查 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;
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        • 2012-10-14
        相关资源
        最近更新 更多