Я пытаюсь получить список изображений из Интернета, чтобы показать их в виде списка в QML. У меня есть код, который выглядит так:
ListView {
objectName: "imageListView"
listItemComponents: [
ListItemComponent {
type: "item"
Container {
WebView {
url: ListItemData.imageSource
}
}
}
]
}
Проблема в том, что это просто вызывает следующую ошибку: «Невозможно назначить [undefined] для URL-адреса QUrl»
Я знаю, что ListItemData.imageSource содержит правильные данные, потому что я протестировал их, используя Label {text: ListItemData.imageSource} вместо WebView, и он показал все URL-адреса изображений, которые необходимы.
Я бы предложил вам использовать ImageView, даже если вы загружаете изображения из Интернета.
Прежде всего, сделайте сетевой запрос, используя классы QNetworkRequest, QNetworkAccessManager и QNetworkReply & при получении ответа загрузите этот QByteArray в ImageView.
QNetworkAccessManager* netManager = new QNetworkAccessManager();
if (netManager) {
QUrl url(ImageUrl);
QNetworkRequest networkRequest(url);
QNetworkReply* networkReply = netManager->get(networkRequest);
connect(networkReply, SIGNAL(finished()), this, SLOT(onReply()));
}
& в слот onReply () вы можете загрузить изображение следующим образом:
void App::onReply(QNetworkReply* reply) {
if (reply->error() != QNetworkReply::NoError) {
qDebug() << "Image not available or any error";
return;
}
Image image = Image(reply->readAll());
imageView->setImage(image);
}
Обратите внимание, что если изображение слишком большое, вам может понадобиться класс ImageData & его метод для загрузки изображения в каскад ImageView. Он не будет загружать изображение напрямую с помощью метода setImage. & чтобы сделать это с ListView, вы должны создать свой собственный CustomItem & ListItemProvider & также необходимо переопределить метод обновления элемента этого. Надеюсь это поможет.
Хорошо, так что я нашел другое решение. Я обновил Beta 2 SDK до Beta 3 SDK. Тогда я просто сделал что-то вроде этого:
#include <QObject>
#include <bb/cascades/Image>
class MyImageClass : public QObject, public bb::cascades::Image
{
Q_OBJECT
Q_PROPERTY(bb::cascades::Image image READ image WRITE setImage NOTIFY imageChanged FINAL)
//...
bb::cascades::Image image_;
public:
//...
bb::cascades::Image image() const {return image_;}
void setImage(bb::cascades::Image image {
image_ = image;
emit imageChanged();
}
signals:
//...
void imageSourceChanged();
}
Затем при вставке изображения в список я просто использовал:
groupDataModel_.insert(myImageObject);
и в моем QML у меня есть:
ListView {
id: imageListView
objectName: "ImageListView"
listItemComponents: [
ListItemComponent {
type: "item"
Container {
id: imagesRoot
objectName: "ImagesRoot"
ImageView {
image: ListItemData.image
}
}
}
]
}