代码之家  ›  专栏  ›  技术社区  ›  Mark

续订QQuickImageProvider请求

  •  2
  • Mark  · 技术社区  · 6 年前

    为了在qml中显示c++模型中的一些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页面加载时,它向图像提供者请求pixmap,但它们还没有准备好。

    过了一段时间,它们在模型中可用,但我不知道如何告诉qml Image 对象更新对提供程序的请求。

    2 回复  |  直到 6 年前
        1
  •  2
  •   eyllanesc RAHUL KUMAR    6 年前

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

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

    *.qml

    Image { 
        source: isLoaded ? "image://MyImageProvider/" : ""}
    }
    
        2
  •  1
  •   dtech    6 年前

    QQuickImageProvider 有一个很好的异步模式,您可以通过传递 QQmlImageProviderBase::ForceAsynchronousImageLoading 到提供程序构造函数。

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

    这也会导致图像按照应用程序请求的顺序加载,而不是其他一些顺序(可能是模型项的顺序)。