QML GridView contentItem длина детей не соответствует количеству - PullRequest
0 голосов
/ 09 апреля 2020

У меня возникли проблемы с GridView, динамически заполненным в разрабатываемом приложении QtQuick. GridView заполняется пользовательским вводом ряда идентичных объектов, за исключением некоторого текста.

    GridView {
        id: grid_fc
        width : parent.width
        height: parent.height / 2

        model: ListModel {}

        delegate: Fancoil {
            objectName: nome
            text: indirizzo
        }
    }

    onNewNode:
    {
        grid_fc.model.append({nome: "fc_" + address, indirizzo: address})
    }

При определенном сигнале приложение должно изменить свойство этих объектов, поэтому я ищу каждый объект by objectName и выполняю задание.

    onStatusChanged:
    {
        for(var i = 0; i <= grid_fc.count; i++)
        {
            if (grid_fc.contentItem.children[i].objectName === "fc_" + address)
            {
                if (online)
                    grid_fc.contentItem.children[i].status(Fancoil.Status.ONLINE)
                else
                    grid_fc.contentItem.children[i].status(Fancoil.Status.OFFLINE)
                break
            }
        }
    }

Если число объектов «мало», GridView.count равен длине GridView.contentItem.children, но, увеличив число, я получаю, что GridView .считайте, что это правильно, вместо неправильной длины детей.

Пример. Заполнение GridView 100 элементами:

  • GridView.count = 100
  • GridView.contentItem.children = 74 (?!)

Что не так с мой код?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Я понял, но я попробовал этот способ, и результат тот же.

Теперь счет модели правильный, и я вижу, как код перебирает все узлы. Это похоже на проблему рендеринга. Изображения вне поля зрения, похоже, не улавливают обновление статуса. Также это происходит: прокрутка сетки вверх и вниз приводит к тому, что некоторые узлы теряют красное свечение (обновление статуса в автономном режиме).

См. Результат первого рендеринга

0 голосов
/ 10 апреля 2020

Если модель имеет 100 тыс. Элементов, для представления неэффективно создавать 100 тыс. Элементов, если он будет отображать только 100. Другими словами, представление динамически создает необходимые элементы, поэтому доступ к этим элементам не рекомендуется. через "детей", так как они могут измениться. Вместо этого вы должны использовать модели:

ListModel{
    id: gridview_model
}
GridView {
    id: grid_fc
    width : parent.width
    height: parent.height / 2

    model: gridview_model

    delegate: Fancoil {
        text: indirizzo
    }
}

onNewNode:
{
    gridview_model.append({status: Fancoil.Status.OFFLINE, indirizzo: address})
}
onStatusChanged: {
    for(var i = 0; i <= gridview_model.count; i++)
    {
         var new_status = online ? Fancoil.Status.ONLINE : Fancoil.Status.OFFLINE
         gridview_model.get(i).status = new_status    
    }
}
...