Обновить запрос QQuickImageProvider - PullRequest
0 голосов
/ 28 июня 2018

Чтобы показать немного Pixmap в QML из модели C ++, я использовал QQuickImageProvider:

class ImageProvider : public QQuickImageProvider
{
public:
    ImageProvider(MyModel *model) : QQuickImageProvider(QQuickImageProvider::Pixmap), _model(model) { }

    QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override
    {
        Q_UNUSED(requestedSize);
        int width = 160;
        int height = 120;

        QString name = id.left(id.indexOf("*"));
        if (size) *size = QSize(width, height);        
        return _model->findThumbnail(name); // retrieve image in the model
    }

private:
    MyModel *_model;
};

Модель готова к запуску, но образы заполняются во время выполнения, медленно. Когда страница QML загружена, она запрашивает у поставщика изображений растровые изображения, но они еще не готовы.

Через некоторое время они доступны в модели, но я не знаю, как сообщить объекту QML Image о возобновлении запроса к поставщику.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

QQuickImageProvider имеет хорошо документированный асинхронный режим, который можно принудительно передать, передав QQmlImageProviderBase::ForceAsynchronousImageLoading в конструктор провайдера.

Насколько я понимаю, запросы будут обрабатываться выделенным потоком и доставляться по завершении. Это означает, что вам нужно остановить поток, пока не будут предоставлены данные изображения, в идеале занятые извлечением указанных данных.

Это также приведет к загрузке изображений в том порядке, в котором они запрашиваются приложением, а не в каком-либо другом порядке, предположительно в порядке элементов модели.

0 голосов
/ 29 июня 2018

Решение простое, создайте новую роль, которая указывает, что изображение полностью загружено.

 setData(index, false, IsLoadedRole);
 // finished loading
 setData(index, true, IsLoadedRole);

*. QML

Image { 
    source: isLoaded ? "image://MyImageProvider/" : ""}
}
...