我正在使用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
组件更新自己。
我试过:我想过:
- 将指向
ImageService
的指针传递给ImageView,但我不知道该怎么做 - 将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