我需要动态选择qpixmap以在QML Image项中显示。这些qpixmap应该从源qpixmap裁剪,我将从QML文件中设置它们。我希望它们能够在第一次从QML进行动态图像处理时由C++代码进行裁剪并缓存以备将来使用。对于动态图像操作,应该从QQuickImageProvider派生出自己的类,并将其加载到QML应用程序引擎中。但是我如何控制源qpixmap呢?通过属性吗?如果是的话,那么我的自定义提供程序必须从QObject派生,并且它的实例应该在QML内声明,不是吗?但是它如何被引擎加载呢?我感觉这种实现方式是错误的,但哪种方式才是正确的呢?
更新:好的,我有一个类:
更新:好的,我有一个类:
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派生MyQuickImageProvider并进行qmlRegisterType),但此时我应该在QML源中声明我的类的实例:
MyQuickImageProvider {
id: my_quick_image_provider
...
}
从main.cpp访问它将会有问题。而且这样的设计对我来说似乎很奇怪。有没有更优雅的解决方案?