在C ++类中创建嵌套的自定义QML组件`Component`

时间:2019-01-02 23:03:33

标签: c++ qt qml

问题

我正在尝试在C ++中创建QML组件(按组件,我指的是Component的{​​{1}}属性使用的Loader类型的QML组件)类并将其传递给QML文件。我正在使用sourceComponent来基于用户与该视图其他位置的UI的交互来动态更改视图的单个区域。这是我实施的方式:

Loader

DynamicLoader.h

class DynamicLoader: public QQuickItem { Q_OBJECT Q_PROPERTY(QObject *mainComp READ getMainComp NOTIFY mainCompChanged) public: DynamicLoader(QQuickItem *parent = Q_NULLPTR); QObject* getMainComp() const; private: QObject* m_mainComp; QObject* createComponent(); signals: void mainCompChanged(); };

DynamicLoader.cpp

DynamicLoader::DynamicLoader(QQuickItem* parent) : QQuickItem(parent) , m_mainComp(new QObject(this)) { m_mainComp = createCustomComponent(); } QObject *DynamicLoader::getMainComp() const { return m_mainComp; } QObject* DynamicLoader::createComponent() { QQmlEngine engine; QQmlComponent component(&engine, QUrl::fromLocalFile("://imports/components/CustomComponent.qml")); QObject* object = component.create(); Q_ASSERT(object); QQuickItem* childItem = qobject_cast<QQuickItem*>(object); childItem->setParent(this); return childItem; }

CustomComponent.qml

Component { CustomTextBox { text: "Custom Text" } }

CustomTextBox.qml

但是,这会使程序崩溃,并显示以下错误消息:

import QtQuick 2.0 Item { property int containerWidth: 580 property alias text: customText.text anchors.fill: parent Text { id: customText text: "Default Text" anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter width: parent.width verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.weight: Font.Bold font.pointSize: 100 color: "white" } } ,并在QQmlComponent: Component is not ready处失败。

其他发现

即使将Q_ASSERT更改为简单的CustomComponent.qml,也会发生相同的错误。当我发现此问题时,我怀疑Component {}可能已经用QQmlComponent类型包装了QML文件(如果我输入错了,请更正),所以我继续将文件转换为:

Component

并遇到相同的错误。

只有当我将文件更改为以下文件时,它才不会出错:

Item {
    CustomTextBox {
        text: "Custom Text"
    }
}

最后,当我完全在QML中实现Item { Item { } } 时,不会发生错误。

问题

  1. 我是否正确地认为声明QQmlComponent已经包装了CustomComponent.qml类型的QML文件?如果没有,我应该如何在C ++中创建一个Component QML组件?

  2. 为什么在创建嵌套的自定义组件时程序崩溃?我是否需要通过其他方式创建组件?

任何对基本误解的帮助和纠正将不胜感激。谢谢。

0 个答案:

没有答案