续订QQuickImageProvider请求

时间:2018-06-28 20:33:30

标签: qt qml qt5

为了显示来自C ++模型的QML中的一些Pixmap,我使用了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 :(得分:2)

解决方案很简单,创建一个新角色来指示图像已完全加载。

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

*。qml

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

答案 1 :(得分:1)

QQuickImageProvider有一个有据可查的异步模式,您可以通过将QQmlImageProviderBase::ForceAsynchronousImageLoading传递到提供程序构造函数来强制使用。

据我了解,请求将由专用线程处理并在完成后交付。这意味着您应该做的是暂停线程,直到提供图像数据为止,最好是忙于获取所述数据。

这还会导致图像以应用程序请求的顺序而不是模型项的其他顺序加载。