我有一个这样的组件:
import QtQuick 2.15
Item {
id: root
property double value: 0.0
property int core: 1
property color progressBarColor: "black"
property color minMaxTextColor: "black"
property int fontSize: height - 6
//....
}
Run Code Online (Sandbox Code Playgroud)
现在我认为让一些属性成为必需的是一个好主意,因为它们应该在使用组件时声明。所以我改成这样:
import QtQuick 2.15
Item {
id: root
required property double value
required property int core
property color progressBarColor: "black"
property color minMaxTextColor: "black"
property int fontSize: height - 6
//....
}
Run Code Online (Sandbox Code Playgroud)
该组件在转发器中被调用,如下所示:
SystemInformation{
id: sysinfo
}
Column{
id: displayColumn
Repeater{
model: sysinfo.coreUtilizationsInPercent.length
CoreUtilizationDisplay{
width: root.elementWidth
height: root.elementHeight
fontSize: root.fontSize
progressBarColor: "#3399FF" // blue
minMaxTextColor: "blue"
core: index + 1
value: sysinfo.coreUtilizationsInPercent[index]
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在这工作正常,直到我获得所需的属性。我想知道为什么它不起作用?
如果我声明它是必需的,我会收到此错误:
qrc:/qml/SystemInformationDisplay.qml:57: ReferenceError: index is not defined
Run Code Online (Sandbox Code Playgroud)
我对中继器中没有的类似组件做了同样的事情,并且工作正常。
为什么?
来自qt开发博客
如果您的委托不包含必需的属性,则此处不会发生任何变化。但是,如果它们至少包含一个必需的属性,则这些名称将无法再访问。相反,您必须通过将它们指定为必需属性来明确选择加入。
在这种情况下,您需要将所需的属性索引添加到组件中。
import QtQuick 2.15
Item {
id: root
required property double value
required property int core
required property int index // add it
property color progressBarColor: "black"
property color minMaxTextColor: "black"
property int fontSize: height - 6
//....
}
Run Code Online (Sandbox Code Playgroud)
通过这个附加索引,您可以构建组件并访问索引。您不需要指定索引。这已经完成了,因为它是一个代表。
Repeater{
model: sysinfo.coreUtilizationsInPercent.length
delegate: CoreUtilizationDisplay{
width: root.elementWidth
height: root.elementHeight
fontSize: root.fontSize
progressBarColor: "#3399FF" // blue
minMaxTextColor: "blue"
core: index + 1
value: sysinfo.coreUtilizationsInPercent[index]
}
}
Run Code Online (Sandbox Code Playgroud)
更多信息可以在文档中找到