创建外部Component的Object的内部组件的对象

时间:2017-11-13 15:16:17

标签: qt qml qt5 qtquick2 qt-quick

是否可以做这样的事情:

import QtQuick 2.7
import QtQuick.Window 2.2

Window{
    id: root_
    visible: true
    width: 300
    height: 300

    Component {
        id:compouter

        Column{
            anchors.fill: parent

            Component {
                id: compinner

                Rectangle {
                    width:parent.width
                    height:parent.height/2
                }
            }
        }
    }

    Component.onCompleted: {

        var c = compouter.createObject(this)
        //var d = c.compinner.createObject(c, {"color": "green"})
        //var e = c.compinner.createObject(c, {"color": "red"})
    }
}

也就是说,我想在外部对象中创建多个对象(在创建外部对象之后)。然而,这是不可能的,因为我得到错误: TypeError: Cannot call method 'createObject' of undefined

这有什么解决方法吗?是否可能只能在外部对象实例化期间实例化所有内部对象?

2 个答案:

答案 0 :(得分:0)

id超出了函数调用的范围。

您可以向外部组件添加一个创建对象的函数:

Component {
    id:compouter

    Column{
        anchors.fill: parent

        function createCompinner(arg) { compinner.createObject(this, arg) }

        Component {
            id: compinner

            Rectangle {
                width:parent.width
                height:parent.height/2
            }
        }
    }
}

或者将内部Component公开为属性:

Component {
    id:compouter

    Column{
        property alias compinner: compinnerComponent
        anchors.fill: parent

        Component {
            id: compinnerComponent

            Rectangle {
                width:parent.width
                height:parent.height/2
            }
        }
    }
}

并像那样访问它。

答案 1 :(得分:0)

好的,我通过向outter对象发送信号找到了解决方法:

import QtQuick 2.7
import QtQuick.Window 2.2

Window{
    id: root_
    visible: true
    width: 300
    height: 300

    Component {
        id:compouter

        Column{
            anchors.fill: parent
            signal createRect(var color)

            onCreateRect: {

                compinner.createObject(this, {"color": color})
            }

            Component {
                id: compinner

                Rectangle {
                    width:parent.width
                    height:parent.height/2
               }
            }
        }
     }

    Component.onCompleted: {

        var c = compouter.createObject(this)
        c.createRect("green")
        c.createRect("red")
    }

它正在运作,但也许有一些更通用的方法(参见接受的答案)。正如海报建议的那样,调用函数在语义上比发送信号更干净