Попытка загрузить изображение в Blackberry Cascades QT и QML

Я пытаюсь загрузить изображения в 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 просто содержит: «Ã¿Ã˜Ã¿Ã, вместо всего содержимого загруженного изображения.

Может ли кто-нибудь объяснить мне это?, и как я могу заставить это работать?


person user1296259    schedule 18.10.2012    source источник


Ответы (3)


Он в форме QByteArray, поэтому он выглядит так. Просто передайте его в конструкторе объекта Image следующим образом:

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

Он должен работать. Если это не так, изображение будет слишком большим, чтобы поместиться в ImageView. Максимальные размеры изображения, которые могут быть обработаны каскадным ImageView, составляют 2048. Поэтому вам может потребоваться использовать класс ImageData для репликации большого изображения в каскадный ImageView.

Также попробуйте загрузить изображение с этого ссылки Это работает для меня с этим url без использования класса ImageData

person Nishant Shah    schedule 19.10.2012
comment
Спасибо, но я все еще получаю ÿØÿà для моего массива байтов, и когда я пытаюсь поместить его в изображение, я получаю это сообщение об ошибке компилятора: ошибка: нет соответствующей функции для вызова 'bb::cascades:: Изображение::Изображение(QByteArray&)' - person user1296259; 19.10.2012
comment
Хорошо, я думаю, вы работаете над бета-версией 2 SDK. В этом классе Image нет конструктора, принимающего QByteArray в качестве параметра. Таким образом, вам нужно создать QImage, используя этот QByteArray, а затем манипулировать этим QImage, используя классы QPainter и PixelBufferData. Я настоятельно рекомендую вам как можно скорее перейти на бета-версию 3 SDK. Когда я переключился, я столкнулся со многими проблемами, так как многие вещи были изменены, а мои усилия были потрачены впустую. Даже класс PixelBufferData устарел и был заменен классом ImageData начиная с бета-версии 3. - person Nishant Shah; 20.10.2012
comment
Если вы все еще хотите, чтобы это работало для бета-версии 2, вы можете взглянуть на это руководство: supportforums.blackberry.com/t5/Cascades-Development-Knowledge/ - person Nishant Shah; 20.10.2012
comment
Спасибо, но в этом руководстве показан не весь код, а ссылка на руководство: Исходный код для этого примера можно загрузить из проекта BlackBerry® на Github® здесь: github.com/blackberry/Cascades-Samples/tree/master/, получает ошибку 404 Not Found Error, если я не могу найти исходный код для него в другом месте. - person user1296259; 22.10.2012
comment
Да, он был удален, так как эти классы устарели. В любом случае, к счастью, у меня есть этот пример кода. Я загрузил здесь по указанной ниже ссылке. Вы можете скачать его оттуда. filedropper.com/qimagescratchpad Я не запускал на устройстве, так как у меня есть устройство с бета-версией 3 ОС . Но вы можете получить представление об этом. - person Nishant Shah; 23.10.2012

Возможно, вы захотите проверить, не перенаправляет ли 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;
    }
}
person Keith    schedule 18.10.2012

На самом деле я думаю, что изображение загружается. Я думал, что загружается всего несколько байтов, но на самом деле это было больше, чем несколько байтов, поэтому при печати с помощью qDebug не появлялась закрывающая кавычка (все изображение занимает одну строку).

person user1296259    schedule 24.10.2012