使用QQuickImageProvider的正确方法是什么?

时间:2015-05-15 18:58:39

标签: c++ image qt qml

我需要动态选择qpixmaps来显示QML图像项目。应该从源qpixmap裁剪qpixmaps,我将从QML文件中设置。我希望它们能够在QML的第一次要求下被C ++代码裁剪,并被缓存以备将来使用。对于操纵它的动态图像,它应该从QQuickImageProvider派生我自己的类并将其加载到QML应用程序引擎。但是我怎么能控制源qpixmap呢?通过财产?如果是,那么我的自定义提供程序必须从QObject派生,它的实例应该在QML中声明,不是吗?但是它怎么能被引擎加载呢?我觉得这种实施方式是错误的,但哪一个是正确的?

UPD:好的,我有一个班级:

Marshal.PtrToStructure

在main.cpp中,它被加载为:

class MyQuickImageProvider : public QQuickImageProvider {
public:
    ...
    // This method should set the source image path
    void setPath ( QUrl path );
    // Overriden method of base class; should return cropped image
    virtual QPixmap requestPixmap ( const QString &id, QSize *size, const QSize &requestedSize );
    ...
}

我想通过QML更改源图像路径。如何使setPath方法可访问?显而易见的方法是将方法声明为Q_INVOKABLE(并从QObject和qmlRegisterType派生MyQuickImageProvider),但是我应该在QML源中声明我的类的实例:

QQmlApplicationEngine engine;
...
engine.addImageProvider("my_quick_image_provider", new MyQuickImageProvider(QQmlImageProviderBase::Image));

从main.cpp访问它会有问题。而这样的设计对我来说似乎很奇怪。还有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:5)

您不使用MyQuickImageProvider作为QML对象,也不定义Q_INVOKABLE方法,因为您无法从QML访问图像提供程序对象。

engine.addImageProvider("my_quick_image_provider", [...]

设置您访问图像的名称,例如

// qml file
Image {
    source: "image://my_quick_image_provider/name_of_my_image"
}

后面的部分" name_of_my_image"被称为id,您可以在

中找到它
virtual QPixmap requestPixmap ( const QString &id, QSize *size, const QSize &requestedSize );

现在在requestPixmap中实施MyQuickImageProvider,让它使用id字符串生成QPixmap。

我认为您可以丢弃void setPath ( QUrl path );方法,因为您只需要一个图像提供程序实例用于此类图像。

由于构造函数不是从基类继承的,所以我认为new MyQuickImageProvider(QQmlImageProviderBase::Image));没有意义。最好添加一个没有参数的构造函数

class MyQuickImageProvider : public QQuickImageProvider {
public:
    MyQuickImageProvider();
    // ...

并在初始化列表中包含图像类型:

MyQuickImageProvider::MyQuickImageProvider()
    : QQuickImageProvider(QQuickImageProvider::Pixmap)
{
}