QML Item, Repeater children, get child by id - PullRequest
0 голосов
/ 07 ноября 2019

Я работаю над проектом, который имеет 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;
        }

Выше не правильно, и вопросесть, как я могу получить доступ к прямоугольникам, используя идентификаторы в каждом прямоугольнике, чтобы я получил прямоугольник, используемый в повторителе?

1 Ответ

2 голосов
/ 07 ноября 2019

Поскольку вы используете элемент, который содержит эти 3 прямоугольника в качестве делегата, у вас не будет идентификаторов доступа извне делегата. Идентификаторы преобразуются в реальные объекты во время компиляции, и они не предназначены для ссылки на объекты во время выполнения.

В любом случае, манипулирование делегатами извне - не очень хорошая идея. Передайте необходимые данные вашему делегату и дайте ему самим решить, что делать.

Вы можете назначить внутренние прямоугольники свойству только для чтения 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)
    }
}

Вы также можете назвать свой объект с помощью свойства objectName и найти его, перебирая свойство children chkItem и проверяя прямоугольник по его objectName

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

Примечание. Вы можете использовать Lodash в QML, что очень поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...