我正在寻找一种动态创建组件和对象的方法,并使用组件。似乎大多数可用的示例(例如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()
}
}
}
答案 0 :(得分:2)
组件不包含对象"。该组件是要实例化的对象的原型。把它想象成" type"或C ++中的class
或struct
与该类型的实例。
您的代码创建组件,然后使用已修改的属性值从中创建对象,但组件仍具有其默认属性,因此将其用作源组件将生成具有默认属性的对象。
此外,Loader
将为您执行自动动态实例化。所以你不需要手动和自动结合,既可以手动操作,也可以让装载机完成。
最后但并非最不重要的是,当组件由StackView
实例化时,它们会自动填充它,并且它们的大小将绑定到它,因此它会随着StackView
大小的变化而自动更改。所以只需使用Item
并将您的内容放在那里并进行布局。只有根项目的大小将绑定到StackView
大小,其子项目将具有自己的大小。