从C++更新自定义QML组件

Update Custom QML component from from C++

本文关键字:QML 组件 自定义 更新 C++      更新时间:2024-05-10

我正在使用Opencv项目开发一个c++/QML。。我发现在QMl中查看处理后的图像的最佳方式是编写一个自定义QMl组件,该组件在c++中扩展了QQuickPaintedItem,并且运行良好:

class ImageView : public QQuickPaintedItem{
Q_OBJECT
Q_PROPERTY(QImage image READ image WRITE setImage NOTIFY imageChanged)
public:
// I need to pass a pointer of ImageService
ImageView(QQuickItem *parent = nullptr, ImageService *imageService = nullptr);
Q_INVOKABLE void updateImage();
void paint(QPainter *painter);
QImage image() const;
signals:
void imageChanged();
private:
QImage m_image;
ImageService *m_imageService;
};

我在C++中注册了这种类型,如下所示:

qmlRegisterType<ImageView>("opencv.plugin", 1, 0, "ImageView");

我的问题是:我有一个类ImageService,它完成所有的工作,并保存处理后的图像的最后版本:

class ImageService
{
public:
ImageService();
bool openImage(const std::string &);
QImage toQImage();
bool isValid();
private:
std::string m_imagePath;
cv::Mat m_image;
};

ImageService使用updateImage()函数执行任何操作之后,我需要ImageView组件更新自己。

我试过:我想过:

  1. 将指向ImageService的指针传递给ImageView,但我不知道该怎么做
  2. 将ImageService作为Qml Property,并将QML图像从QML传递到ImageView组件,但我认为这不是一个好主意

如果只有一个ImageView,那么很容易将其作为模型的Q_PROPERTY

class ImageModel : public QObject 
{
Q_OBJECT
Q_PROPERTY(ImageView *image1 READ image1 CONSTANT)
public:
ImageModel(ImageService *service)
: service_(service)
, image1_(new ImageView(/*parent=*/ this, /*service=*/service_)
{ }
ImageView* image1() const { return image1_; }
private:
ImageService *service_;
ImageView *image1_;
}

更改主菜单:

...
qmlRegisterUncreatableType<ImageService>(...);
qmlRegisterUncreatableType<ImageView>(...);
qmlRegisterUncreatableType<ImageModel>(...);
QQmlEngine engine;
ImageService theService;
ImageModel coreModel(&theService);
QQmlContext *context = new QQmlContext(engine.rootContext());
context->setContextProperty("images", &coreModel);

您可以使用的qml中:

<imageproperty>: images.image1