尝试在 Blackberry Cascades QT 和 QML 中下载图像

Posted

技术标签:

【中文标题】尝试在 Blackberry Cascades QT 和 QML 中下载图像【英文标题】:Attempting to download an image in Blackberry Cascades QT, and 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 只包含:“ÿØÿÃ,而不是我下载的图像的全部内容。

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

【问题讨论】:

【参考方案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 打印出来时没有显示结束引号的原因,(整个图像在一行上)。

【讨论】:

以上是关于尝试在 Blackberry Cascades QT 和 QML 中下载图像的主要内容,如果未能解决你的问题,请参考以下文章

BlackBerry Cascades 中的 QML 字符串

无法在 BlackBerry Cascades 中通过 https 加载 JSON 数据源

BlackBerry Cascades 10 Maps 示例一直显示黑屏

如何在 Blackberry Cascades、QML 和 C++、QT 的列表视图中获取 Web 视图

Blackberry Cascades 上下文菜单从按钮单击

Blackberry 10 Cascades、qml (C++ & QT) 中的布局存在问题