Russian Qt Forum

Qt => Qt Quick => Тема начата: shtrix от Февраль 22, 2018, 18:01



Название: ListView количество элементов и обращение к ним
Отправлено: shtrix от Февраль 22, 2018, 18:01
Qt 10.1
QtCreator 4.5.1
Код:
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
Window {
    visible: true
    width: 150
    height: 250
   
    ScrollView {
        anchors.fill: parent
       
        ListView {
            id:list
            width: parent.width
            model: 5
            delegate: ItemDelegate {
                property alias title: title.text
                width: parent.width
               
                Label{
                    id:title
                    text:"Item "+index
                }
               
                onClicked: {
                    console.log("list.count=",list.count)
                    for(var i=0;i<list.count;i++){
                        console.log(list.contentItem.children[i].title)
                    }
                   
                }
            }
        }
    }
}
Отображается все как положено.
(https://drive.google.com/uc?export=download&confirm=no_antivirus&id=1ymcAnSvmiSjr73a_0JgUuoYEcTHmEnwZ)
По клику получаю в консоль :
Код:
qml: list.count= 5
qml: Item 0
qml: undefined
qml: Item 1
qml: Item 2
qml: Item 3

Не пойму что происходит .  Почему второй Item undefined
То есть чтобы адекватно получить все значения надо пропускать элемент с индексом 1  как то так :
Код:
for(var i=0;i<list.count;i++){
    i==0?console.log(list.contentItem.children[i].title)
           :console.log(list.contentItem.children[i+1].title)
}
Получаю в консоль :
Код:
qml: list.count= 5
qml: Item 0
qml: Item 1
qml: Item 2
qml: Item 3
qml: Item 4
Но как я понимаю такого быть не должно.
Подскажите в чем проблема?


Название: Re: ListView количество элементов и обращение к ним
Отправлено: Igorkam от Февраль 26, 2018, 11:20
А что будет, если вывести index в onClicked?


Название: Re: ListView количество элементов и обращение к ним
Отправлено: navrocky от Май 18, 2018, 21:32
Очевидно что в list.contentItem лежит еще один какой-то невидимый элемент, не твой ItemDelegate, возможно какая-то особенность реализации.

Код:
qml: list.count= 5
qml: QQuickItemDelegate_QML_0(0x262dd10)
qml: QQuickItem(0x2784e90)
qml: QQuickItemDelegate_QML_0(0x266a3d0)
qml: QQuickItemDelegate_QML_0(0x27a0970)
qml: QQuickItemDelegate_QML_0(0x279ee70)

Более того так неправильно перебирать итемы, так как ListView создает их по мере появления в области видимости и уничтожает при уходе итема из неё. Поэтому если ты перебираешь детей у contentItem, там будут к примеру с десятого итема по двадцатый в зависимости от позиции скролла.