Qt QML项,中继器子项,按id获取子项
我正在从事一个项目,其QML类似:Qt QML项,中继器子项,按id获取子项,qt,qml,Qt,Qml,我正在从事一个项目,其QML类似: Item { id: cameraButtonBar ... Row { Repeater { id: repeaterId model: cameraModel.cameraPositions() Item { Rectangle {
Item {
id: cameraButtonBar
...
Row {
Repeater {
id: repeaterId
model: cameraModel.cameraPositions()
Item {
Rectangle {
id: fullSelectedCameraMarker
...
visible: cameraButtonBar.checkCaptured(index, false, false)
}
Rectangle {
id: map1SelectedCameraMarker
...
visible: cameraButtonBar.checkCaptured(index, true, false)
}
Rectangle {
id: map2SelectedCameraMarker
...
visible: cameraButtonBar.checkCaptured(index, false, true)
}
}
}
}
}
在我的脚本“checkCaptured”JavaScript中:
function checkCaptured(idx, left, right) {
//Can't do anything until an image is selected
if ( root.selectedImageIdx >= 0 ) {
var chkItem = repeaterId.itemAt(idx);
if ( typeof chkItem === "object" ) {
var marker;
if ( left === false && right === false ) {
marker = chkItem.fullSelectedCameraMarker;
} else if ( left === true ) {
marker = chkItem.map1SelectedCameraMarker;
} else if ( right === true ) {
marker = chkItem.map2SelectedCameraMarker;
}
if ( marker !== undefined ) {
}
}
}
return false;
}
上面的说法不正确,问题是,如何使用每个矩形中的ID访问矩形,以便获得中继器中使用的矩形?当您将包含这3个矩形的项目作为代理使用时,您将不会从代理外部获得访问ID。ID在编译时被转换为实际对象,它们不打算在运行时引用对象 无论如何,从外部操纵代理不是一个好主意。将所需数据传递给您的学员,让他们自己决定做什么。 您可以将内部矩形指定给chkItem的只读属性,并在稍后的函数中引用它们
Item {
readonly property Rectangle _fullSelectedCameraMarker: fullSelectedCameraMarker
readonly property Rectangle _map1SelectedCameraMarker: map1SelectedCameraMarker
readonly property Rectangle _map2SelectedCameraMarker: map2SelectedCameraMarker
Rectangle {
id: fullSelectedCameraMarker
...
visible: cameraButtonBar.checkCaptured(index, false, false)
}
Rectangle {
id: map1SelectedCameraMarker
...
visible: cameraButtonBar.checkCaptured(index, true, false)
}
Rectangle {
id: map2SelectedCameraMarker
...
visible: cameraButtonBar.checkCaptured(index, false, true)
}
}
您还可以使用属性命名对象,并通过迭代chkItem
的属性并按其属性检查矩形来查找它们
var chkItem=repeaterId.itemAt(idx);
var chkItemChildren=chkItem.children;
//使用您喜欢的任何机制对孩子进行迭代以过滤这些孩子
//
对于(变量i=0;i
注意:您可以在QML中使用,这将非常有帮助。谢谢,我发现了一个更好的解决方案,它不需要搜索或遍历列表。@splaten,我只是更新答案。从外部操纵代理不是一个好主意。为什么在
只读属性var\u fullSelectedCameraMarker:fullSelectedCameraMarker
中使用var
?当你知道它是一个QtObject
或者甚至是一个项目时,使用var
也不是一个好主意。@derM,请解释或参考某个地方解释为什么它不好。谢谢,当然可以。阅读节绑定:-var不允许优化绑定。一般来说,向引擎提供尽可能多的信息是一个好主意,因此它可以选择更专业和优化的例程。
Rectangle {
id: fullSelectedCameraMarker
objectName: "fullSelectedCameraMarker"
...
visible: cameraButtonBar.checkCaptured(index, false, false)
}
var chkItem = repeaterId.itemAt(idx);
var chkItemChildren = chkItem.children;
// iterate over children using any machanism you prefer to filter those children
//
for( var i = 0 ; i < chkItemChildren.length ; ++i)
{
if(chkItemChildren[i].objectName==='fullSelectedCameraMarker'){
// whatever you want to do
}
}