QML在Component中使用createObject填充ColumnLayout

时间:2018-03-01 09:11:00

标签: qt tabs qml components tabview

我想在TabView / Tab中动态地向ComponentLayout添加一个Component。但我没有找到这样做的可能性。问题是我对我的ColumnLayout没有对createObject调用的正确父引用。 因为Tab动态加载了一个Component,我将ColumnLayout封装在一个Component中。

在QML调试器中,我可以解决以下路径: objForm.tabView.tabStatus.tabStatusLoader.colLayout ,但我无法将其用作正确的父路径。

似乎不在范围内。

TypeError: Cannot read property 'tabStatus' of undefined

ObjForm.ui.qml

Item {
    id: item1
    width: 400
    height: 400

    property QtObject object

    property Component compLayout

    TabView {
        id: tabView
        anchors.fill: parent
        Tab {
            id: tabStatus
            title: "status"
            Loader {
                id: tabStatusLoader
                sourceComponent: compLayout
            }
        }
    }
}

ObjForm.qml

ObjectViewForm {
    id: objForm
    anchors.fill: parent
    object: someObj

    compLayout: Component {
        id: layoutComp
        ColumnLayout {
            id: colLayout
            spacing: 2
        }
    }

    onObjectChanged: {
        // Here i want to add the someLabel Component to the ColumnLayout
        someLabel.createObject(*PARENT*)
    }

Component {
    id: someLabel

    Row {
        property string text
        property string label

        spacing: 5

        Label {
            text: parent.label
        }

        Label {
            text: parent.text
        }
    }
}

有谁知道如何解决这个问题或者可以提出更好的建议?

1 个答案:

答案 0 :(得分:0)

好的,我自己找到了解决方案。而不是将ColumnLayout包含到Component中,我已将其拉出并创建了一个别名属性来发布它。有了这个,可以将对象添加到我的ColumnLayout。但是ColumnLayout得到了错误的父(objForm)而不是Component。

组件不能是父组件,因为预期QQuickItem *而不是QObject *,并且除了“id”之外,其他组件不能包含属性。因此需要一个虚拟物品。

要重新显示ColumnLayout,Item需要一个Component.onCompleted函数,其中将设置父级。

ObjectViewForm {
        id: objForm
        anchors.fill: parent
        object: someObj

        property alias componentLayout: colLayout

        compLayout: Component {
            id: layoutComp
            Item {
                id: dummy
                Component.onCompleted:  {
                    colLayout.parent = dummy
                }
            }
        }

        ColumnLayout {
            id: colLayout
            spacing: 2
        }