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

标签 c++ image qt qml

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

UPD:好的,我有课:

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 );
    ...
}

在 main.cpp 中它被加载为:

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

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

MyQuickImageProvider {
    id: my_quick_image_provider
    ...
}

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

最佳答案

您没有将 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 );

现在在您的 MyQuickImageProvider 中实现 requestPixmap 并让它使用 id 字符串来生成 QPixmap。

我认为您可以放弃 void setPath ( QUrl path ); 方法,因为您只需要一个图像提供程序实例来处理所有此类图像。

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

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

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

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

关于c++ - QQuickImageProvider 的正确使用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30266881/

相关文章:

python - PySide Qt : Auto vertical growth for TextEdit Widget, 和垂直布局中小部件之间的间距

c++ - 继承自定义TabBar和resizeEvent的实现

c++ - 运行 boost 的 io 服务时无法计算字符串

c++ - 枚举常量在 C 和 C++ 中的行为不同

c - 图像卷积,误差生成滤波图像

javascript - 浏览器缓存图像防止淡入

c++ - QComboBox : Can we make the entire combobox clickable, 不只是下拉按钮(箭头)本身?

c++ - 通过 std::enable_if_t 传递被调用方法的返回值

c++ - LNK2005 : already defined error

javascript - 无法通过 Canvas 上的 WebApi 调用绘制图像