Qt QML Notify ListView, когда элементы в модели добавляются или удаляются - PullRequest
2 голосов
/ 24 июня 2019

Мой ListView всегда должен прокручивать свой активный в данный момент элемент до вершины между preferredHighlightBegin и preferredHighlightEnd. Это работает при нажатии на элемент. Однако, когда новый элемент добавляется в мою модель AbsctractListModel (и он не только добавляется в конец, но может быть добавлен в любом месте посередине), ListView показывает новый элемент, но он не прокручивается вверх. Это наиболее вероятно, потому что list.currentIndex = index не установлен для новых добавленных элементов. Я хочу установить его, но пока не нашел способа сделать это. У кого-нибудь есть подсказка?

Я пробовал разные сигналы, такие как onCurrentItemChanged, но пока не нашел подходящий, который также дает мне правильный индекс.

ListView {
    id: list
    anchors.fill: parent
    clip: true
    spacing: 11
    focus: true
    highlightMoveDuration: 400
    snapMode: ListView.SnapToItem
    preferredHighlightBegin: 0
    preferredHighlightEnd: 100
    highlightRangeMode: ListView.StrictlyEnforceRange

    model: myAbstractListModel

    delegate: ListItem {
                  height: 56
                  width: list.width
                  color: "red"
                  onListItemClicked: {
                      list.currentIndex = index
                  }
              }
}

Ожидаемым результатом будет ListView, который прокручивает программно новый добавленный элемент моей AbstractListModel вверх (между preferredHighlightBegin и preferredHighlightEnd).

1 Ответ

2 голосов
/ 24 июня 2019

Добавление этого значения к вашему ListView изменит текущий индекс на последний при каждом изменении количества элементов в модели. Возможно, вы захотите отслеживать количество предыдущих элементов, если хотите прокрутить только при вставке.

onCountChanged: {
    if (count > 0) {
        currentIndex = count - 1;
    }
}

Если новые элементы могут быть вставлены в любое место модели, вы можете подключиться к нему напрямую, используя элемент Соединения внутри вашего ListView, и подключить его напрямую к rowInserted сигнал QAbstractItemModel.

Connections {
    target: model
    onRowsInserted: {
        currentIndex = first + 1;
    }
}

Если ваша модель излучает только сигнал dataChanged, вы можете попробовать это.

Connections {
    target: model
    onDataChanged: {
        currentIndex = topLeft.row() + 1;
    }
}
...