我正在创建一个自定义QML组件(ListView
的特化,允许多个选择)。我想为提供给我的组件的对象提供附加属性。我知道如何create attached properties using C++。但是,我找不到有关在纯QML中添加自定义属性的信息。这可能使用QML吗?
答案 0 :(得分:6)
这可以使用QML吗?
没有
答案 1 :(得分:3)
在QML中有一种替代的,简单易用的方法 - 只需使用实现所需属性的适配器对象。然后,而不是只将nest连接到适配器 - 使用它作为父/容器。您还可以将对象嵌套到适配器中,获取另一个C ++独占分组属性。最小化此开销的一种可能方法是使用JS对象和属性,但有一个缺点 - 没有更改通知,您可以通过手动发送来缓解这些通知。
一个例子:
// Adapter.qml - interface with attached properties
Item {
id: adapter
property int customInt : Math.random() * 1000
property var group : {"a" : Math.random(), "b" : Math.random() }
default property Component delegate
width: childrenRect.width
height: childrenRect.height
Component.onCompleted: delegate.createObject(adapter)
}
// usage
ListView {
width: 100
height: 300
model: 5
delegate: Adapter {
Row {
spacing: 10
Text { text: index }
Text { text: customInt }
Text { text: group.a }
Text { text: group.a }
}
}
}
与其他一些QML解决方案相比,它相当轻松,方便。你甚至不必做parent.parent.customInt
- 这些属性可以直接访问,就像它们被附加一样,这是因为动态范围。 default property
允许避免将内部委托设置为您只需将代理直接嵌套在适配器中的属性。
在许多情况下,这些杂技都是矫枉过正的,你可以把它包裹起来:
ListView {
width: 100
height: 300
model: 5
delegate: Item {
width: childrenRect.width
height: childrenRect.height
property string custom1: "another"
property string custom2: "set of"
property string custom3: "properties"
Row {
spacing: 10
Text { text: index }
Text { text: custom1 }
Text { text: custom2 }
Text { text: custom3 }
}
}
}
唯一关键部分实际上是对适配器对象大小的绑定,以便视图可以正确布局对象。我经常使用Wrap
元素,它基本上是相同的,但是用C ++实现,它比QML绑定更有效。