Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QML项,中继器子项,按id获取子项_Qt_Qml - Fatal编程技术网

Qt QML项,中继器子项,按id获取子项

Qt QML项,中继器子项,按id获取子项,qt,qml,Qt,Qml,我正在从事一个项目,其QML类似: Item { id: cameraButtonBar ... Row { Repeater { id: repeaterId model: cameraModel.cameraPositions() Item { Rectangle {

我正在从事一个项目,其QML类似:

    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
    }
}