不能在 QML 中使用 C++ QQuickPaintedItem Singleton

Cannot use C++ QQuickPaintedItem Singleton in QML

我必须创建一个 C++ 单例 class,但它在 qml 中不起作用。

#include "myimage.h"
MyImage::MyImage(QQuickPaintedItem *parent)
{

}

MyImage* MyImage::myImage = new MyImage;

MyImage *MyImage::instance()
{
    return myImage;
}

void MyImage::paint(QPainter *painter)
{
    QRectF target(10.0, 20.0, 80.0, 60.0);
    QRectF source(0.0, 0.0, 70.0, 40.0);
    painter->setRenderHint(QPainter::Antialiasing, true);
    painter->setRenderHint(QPainter::SmoothPixmapTransform, true );
    painter->drawImage(target, this->m_Image, source);
}

const QImage &MyImage::getM_Image() const
{
    return m_Image;
}

void MyImage::setM_Image(const QImage &mimage)
{
    if (mimage != m_Image) {
        m_Image = mimage;
        emit m_ImageChanged();
    }
}//This is my singleton class.

然后我在main.cpp里注册。

QObject *getMySingletonImage(QQmlEngine *engine, QJSEngine *scriptEngine)
{
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)

    return MyImage::instance();
}
...
qmlRegisterSingletonType<MyImage>("s0.image", 1, 0, "MyImage", &getMySingletonImage);

在 QML 中:

import s0.image 1.0
MyImage{

            }

我无法运行程序成功。

qrc:/Camview_Page.qml:371:13: Element is not creatable.

实际上,我在后端和 qml 中都使用单例 class。 在我的后端,我会得到QImage类型的图像,但不会保存在本地,所以我不能使用QUrl,我只能想出这个方法。

期望: 我的后台传QImage类型的图片给单例class,我的单例class实现了paint的方法,我的qml显示图片。

顺便说一句...我的后端从相机获取图像。

已经为 QML 创建了单例,因此您会收到该错误消息,因为您正在尝试使用“{}”创建对象。

在这种情况下,设置父级和大小就足够了:

import QtQuick 2.15
import QtQuick.Window 2.15

import s0.image 1.0

Window {
    id: root
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Component.onCompleted: {
        MyImage.parent = root.contentItem
        MyImage.width = 100
        MyImage.height = 100
    }
}

如果您想创建一个绑定,例如设置 anchors.fill: parent,那么您可以使用 Binding component, if you want to hear any signal then you must use Connections 组件。

import QtQuick 2.15
import QtQuick.Window 2.15

import s0.image 1.0

Window {
    id: root
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Binding{
        target: MyImage
        property: "parent"
        value: root.contentItem
    }
    Binding {
        target: MyImage
        property: "anchors.fill"
        value: MyImage.parent
    }
    Connections{
        target: MyImage
        function onWidthChanged(){
            console.log("width:", MyImage.width)
        }
        function onHeightChanged(){
            console.log("height:", MyImage.height)
        }
    }
}