Как получить доступ к свойствам детей случайного повторителя? - PullRequest
1 голос
/ 13 июня 2019

У меня есть сетка с вложенными элементами (текст и область мыши внутри прямоугольника):

    property variant colorArray: ["#00bde3", "#67c111", "#ea7025"]

...
Grid{
        rows: 5
        columns: 5
        spacing: 5
        anchors.centerIn: parent
        Repeater{
            id: gridRect
            model: 25
            Rectangle{
                id: rect
                width: 50
                height: width
                color: "white"
                radius: 5
                Text {
                    id: tttt
                    anchors.centerIn: parent
                    color: "lightBlue"
                    text : index
                }
                MouseArea{
                    anchors.fill: parent
                }

            }
        }

    }

и я хочу случайным образом изменить цвет некоторых квадратов и текстов в сетке, но я не знаю, как получить к ним доступ, я попытался использовать таймеры, подобные этому:

Timer {
        id: alfa
        interval: 500; running: true; repeat: true
        onTriggered: {

            /*if random square not white , a color from color array is picked to change it
            else random square.color = "white"*/
        }

    }
    Timer {
        id: beta
        interval: 1000; running: true; repeat: true
        onTriggered: {
           //changes the text of a random tttt element in the grid
        }
    } 

Я перепробовал много вещей, но все это не удалось, например, использование привязки свойств, казалось, изменило весь цвет сетки и текст, а не один квадрат, я не могу понять, как вообще получить доступ к вложенным элементам и дочерним элементам повторителей, а документация - нет ' t, что мне делать?

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Поскольку они хотят изменить информацию, отображаемую в представлении, вам не следует взаимодействовать с ней напрямую, а создать модель, и с ее помощью вы должны изменить данные:

property variant colorArray: ["#00bde3", "#67c111", "#ea7025"]

ListModel{
    id: mymodel
    Component.onCompleted: {
        for(var i=0; i<25; i++){
            mymodel.append({"text": ""+i, "color": "white"})
        }
    }
}
Grid{
    rows: 5
    columns: 5
    spacing: 5
    anchors.centerIn: parent
    Repeater{
        id: gridRect
        model: mymodel
        Rectangle{
            id: rect
            width: 50
            height: width
            color: model.color
            radius: 5
            Text {
                id: tttt
                anchors.centerIn: parent
                color: "lightBlue"
                text : model.text
            }
            MouseArea{
                 anchors.fill: parent
            }
        }
    }
}
Timer{
    id: alfa
    interval: 500; running: true; repeat: true
    onTriggered: {
        var random_color = colorArray[Math.floor(Math.random() * colorArray.length)]
        var random_ix = Math.floor(Math.random() * mymodel.count);
        var elem = mymodel.get(random_ix)
        elem.color = elem.color === "white" ? random_color : "white"
    }
}
Timer{
    id: beta
    interval: 1000; running: true; repeat: true
    onTriggered: {
        // https://stackoverflow.com/a/38620178
        var random_str = "";
        var alphabet = "abcdefghijklmnopqrstuvwxyz";
        while (random_str.length < 6) {
            random_str += alphabet[Math.floor(Math.random() * alphabet.length)];
        }
        var random_ix = Math.floor(Math.random() * mymodel.count);
        var elem = mymodel.get(random_ix)
        elem.text = random_str
    }
}
0 голосов
/ 13 июня 2019

Вы можете думать, что повторители работают так, как будто вы только что скопировали этот прямоугольник в сетку 25 раз.Это означает, что для доступа к одному из них вам необходимо получить доступ к children таблицы.

Вы можете использовать ответ eyllanesc из ранее и отредактировать данные в ListModel (этоЯ думаю, правильный способ сделать это)

Или вы можете использовать функцию 'children' , которая также должна присутствовать в Grid, которая возвращает массив потомков, которыеВладеет сеткой, то есть прямоугольниками, которые вы добавили через Repeater.

Я бы лично сделал это способом ListModel.

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