QML:如何使用自定义内部对象的动态创建组件?

时间:2015-03-24 15:54:49

标签: c++ qt qml qt5

我正在寻找一种动态创建组件和对象的方法,并使用组件。似乎大多数可用的示例(例如Qt文档或其他StackOverflow帖子中的那些示例)与使用从createObject()返回的对象相关,而我想使用包含(自定义)对象的组件。

我已经删除了许多无关的细节(例如,CustomContainer被推入/弹出StackViews),但是下面的代码有希望说明我正在尝试做什么...基本上,我想要使用foo = 10和bar = 10的CustomControl矩形,但它似乎加载了默认值。将有多个"自定义控件"类型和多个"自定义容器"对象所以我需要能够一般地支持​​这个。

Qt文档谈到了creation contexts,我认为这是我的问题,但我不知道如何解决这个问题。我更喜欢纯粹的QML解决方案,但是如果解决方案所在,那么C ++就没问题。

Main.qml:

CustomContainer {
    id: myCustomContainer
}

CustomContainer {
    id: myOtherCustomContainer
}

function addCustomControl( control, args ) {
    var newComponent = Qt.createComponent( control )
    var newObj = newComponent.createObject( myCustomContainer, args )
    return newComponent
}

myCustomContainer.loaderSource = addCustomControl( "CustomControl.qml", { "foo": 10, "bar": 10 } )

myOtherCustomContainer.loaderSource = addCustomControl( "CustomControl.qml", { "foo": 20, "bar": 20 } )

CustomControl.qml:

Rectangle {
    property int foo: 5
    property int bar: 5
}

CustomContainer.qml:

Item {
    property Component loaderSource

    onLoaderSourceChanged: {
        myLoader.sourceComponent = loaderSource
    }

    Loader {
        id: myLoader

        onSourceComponentChanged: {
            doStuff()
        }
    }
}

1 个答案:

答案 0 :(得分:2)

组件不包含对象"。该组件是要实例化的对象的原型。把它想象成" type"或C ++中的classstruct与该类型的实例。

您的代码创建组件,然后使用已修改的属性值从中创建对象,但组件仍具有其默认属性,因此将其用作源组件将生成具有默认属性的对象。

此外,Loader将为您执行自动动态实例化。所以你不需要手动和自动结合,既可以手动操作,也可以让装载机完成。

最后但并非最不重要的是,当组件由StackView实例化时,它们会自动填充它,并且它们的大小将绑定到它,因此它会随着StackView大小的变化而自动更改。所以只需使用Item并将您的内容放在那里并进行布局。只有根项目的大小将绑定到StackView大小,其子项目将具有自己的大小。