我正在寻找一种动态创建组件和对象的方法,并使用组件。似乎大多数可用的示例,如Qt文档或其他StackOverflow帖子中的示例,都与使用createObject()返回的对象有关,而我希望使用包含(自定义)对象的组件。
我去掉了很多无关的细节(例如,CustomContainer被推到StackViews上/弹出),但下面的代码有望说明我要做的事情……基本上,我希望有一个foo=10和bar=10的CustomControl矩形,但它似乎是用默认值加载的。将有多个"自定义控件"类型和多个"定制容器"对象,所以我需要能够通用地支持这一点。
Qt文档讨论了创建上下文,我认为这是我的问题,但我不确定如何解决这个问题。我更喜欢纯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()
}
}
}
组件不"包含对象"。该组件是要实例化的对象的原型。把它想象成C++中的一个"类型"或class
或struct
,而不是该类型的实例。
您的代码创建组件,然后从中创建一个具有修改后的属性值的对象,但该组件仍然具有其默认属性,因此将其用作源组件将生成具有默认属性的对象。
此外,Loader
将为您进行自动动态实例化。所以你不需要手动和自动结合,要么手动,要么让加载器来做
最后,但并非最不重要的是,当组件由StackView
实例化时,它们将自动填充它,并且它们的大小将绑定到它,因此它将随着StackView
大小的变化而自动更改。因此,只需使用Item
,将您的内容放在其中并进行布局。只有根项目的大小将绑定到StackView
大小,其子项目将有自己的大小。