Qt Quick-如何在QML接口中使用从QQuickPaintedItem继承的C ++类?

时间:2019-12-24 15:21:15

标签: c++ qt qml qt-quick qqmlengine

我是Qt 5.13.0的新手。在Visual Studio 2019项目中,我需要在qml界面中显示从QQuickPaintedItem类继承的自定义绘制项目。该自定义项用名为WQTMessageItem的c ++类编写,该类声明如下:

class WQTMessageItem : public QQuickPaintedItem
{
    Q_OBJECT
    Q_PROPERTY(bool rightAligned READ isRightAligned WRITE setRightAligned NOTIFY rightAlignedChanged)

    signals:
        void rightAlignedChanged();

    public:
        WQTMessageItem(QQuickItem* parent = 0);

        void paint(QPainter* painter);

        bool isRightAligned();
        void setRightAligned(bool rightAligned);

    private:
        bool m_RightAligned;
};

在c ++方面,我正在尝试通过以下方式向qml引擎声明上述类:

QQmlContext* pContext = engine.rootContext();
std::unique_ptr<WQTMessageItem> pMessageItem(new WQTMessageItem());
pContext->setContextProperty("WQTMessageItem", pMessageItem.get());
pMessageItem.release();

最后,我尝试以这种方式在qml文件中声明的ListView中使用以上自定义项:

ListView
{
    anchors.bottom: controls.top
    anchors.bottomMargin: 2
    anchors.top: parent.top
    id: balloonView

    delegate: WQTMessageItem
    {
        anchors.right: index % 2 == 0 ? undefined : parent.right
        height: 60
        rightAligned: index % 2 == 0 ? false : true
        width: balloonWidth
    }

    model: balloonModel
    spacing: 5
    width: parent.width
}

不幸的是,这不起作用。我的应用程序可以编译和链接,但是在运行时会立即关闭,并显示以下错误消息:

QQmlApplicationEngine failed to load component
qrc:/main.qml:33 WQTMessageItem is not a type

我试图自己找到解决方案,但没有成功。有人可以解释我如何修改上面的代码以使其起作用吗?

1 个答案:

答案 0 :(得分:1)

您必须使用qmlRegisterType函数在QML系统中注册C ++类型。
可以找到一个示例here

setContextProperty方法旨在将值(不是类型)从C ++导出到QML。