我正在寻找一种动态创建组件和对象并使用组件 的方法。似乎大多数可用示例(例如 Qt 文档或其他 StackOverflow 帖子中的示例)都与使用从 createObject() 返回的对象有关,而我想使用包含(自定义)对象的组件。
我已经删除了很多无关的细节(例如,CustomContainer 被插入 StackViews 或从 StackViews 弹出),但以下代码有望说明我正在尝试做的事情......基本上,我想要带有 foo = 10 和 bar = 10 的 CustomControl 矩形,但它似乎加载了默认值。将有多个“自定义控件”类型和多个“自定义容器”对象,因此我需要能够通用地支持它。
Qt 文档讨论了 creation contexts ,我认为这是我的问题,但我不确定如何解决这个问题。我更喜欢纯粹的 QML 解决方案,但如果这是解决方案所在,C++ 也可以。
主.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 } )
自定义控件.qml:
Rectangle {
property int foo: 5
property int bar: 5
}
自定义容器.qml:
Item {
property Component loaderSource
onLoaderSourceChanged: {
myLoader.sourceComponent = loaderSource
}
Loader {
id: myLoader
onSourceComponentChanged: {
doStuff()
}
}
}
最佳答案
组件不“包含对象”。组件是要实例化的对象的原型(prototype)。将其视为“类型”或 class
或 struct
在 C++ 中与该类型的实例。
您的代码创建组件,然后使用修改后的属性值从中创建一个对象,但该组件仍具有其默认属性,因此将其用作源组件将生成具有默认属性的对象。
此外,一个 Loader
将为您自动动态实例化。因此,您不需要将手动和自动结合起来,要么手动完成,要么让装载机完成。
最后但同样重要的是,当组件被 StackView
实例化时他们会自动填充它并且它们的大小会绑定(bind)到它,所以它会自动更改为 StackView
尺寸变化。所以只需使用 Item
并将您的内容放在那里并对其进行布局。只有根项的大小将绑定(bind)到 StackView
大小,它的子项目将有自己的大小。
关于c++ - QML:如何将动态创建的组件与自定义的内部对象一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29237247/