Я следующий this учебник (без flickable содержания в каждой записи) для Qt 4.8 при использовании Qt 5,7 с QtQuick 2.0
. Образом ListView
там работает следующим образом:QML ListView - изменить все, кроме текущего элемента
- Пользователь нажимает на элемент в списке
- Alternative (детальный) вид элемента отображается
- Пользователь должен нажать на
Close
кнопку в детализированном виде, чтобы сбросить состояние входа в компактный вид по умолчанию.
Это приводит к беспорядку, когда в какой-то момент, если пользователь нажимает на все предметы, в этом случае все будет отображаться в их полном представлении. Если пользователь нажимает кнопку Close
каждый раз, когда он открывает подробный вид, это также (omho) не так удобно.
Я изменил запись, чтобы закрыть ее, когда пользователь нажимает на представление. Я также пытается предотвратить этот беспорядок и достичь более (omho) протекающий поведение:
- пользователь щелкает по пункту в списке
- Альтернативный вид элемента отображается
- пользователь щелкает на детализированном виде, чтобы сбросить состояние входа в состояние по умолчанию компактный вид ИЛИ
- Пользователь нажимает на другую запись и все в настоящее время в подробных записях просмотра сбрасываются компактному зрения
В настоящее время я перебираю ListView
contentItem.children[loop_index]
и устанавливаю состояние на ""
("Details"
= Показать детальный вид | ""
= показать компактный вид). Из-за того, как работает ListView
(загрузка/выгрузка делегатов по запросу), это довольно ненадежно, и я часто получаю неопределенную ссылку, когда пытаюсь получить доступ к состоянию других делегатов. Следующий MouseArea
, который я использую, чтобы сделать все, что является частью каждого делегата:
// state is a QML `State` that is bound to the delegate (see below for the details on it)
MouseArea {
anchors.fill: background
onClicked: {
// Iterate through all other entries and close them
for (var entry = 0; entry < listView.count; ++entry) {
if(listView.contentItem.children[entry] !== gestureEntry) {
console.log("Hide other element");
listView.contentItem.children[entry].state = ""; // IT FAILS HERE (SOMETIMES)
}
}
// Change view of current entry
if(gestureEntry.state === "Details") {
gestureEntry.state = "";
console.log("Hiding details")
}
else {
gestureEntry.state = "Details";
console.log("Showing details");
}
}
}
с state
быть государством делегата:
states: State {
name: "Details"
PropertyChanges { target: background; color: "white" }
PropertyChanges { target: gestureImage; width: 130; height: 130 } // Make picture bigger
PropertyChanges { target: gestureEntry; detailsOpacity: 1; x: 0; y: 0 } // Make details visible
PropertyChanges { target: gestureEntry; height: listView.height } // Fill the entire list area with the detailed view
}
Я имею в виду, что state
информация может храниться внутри самого ListModel
, что позволяет выполнять итерацию содержимого модели (которая всегда присутствует в отличие от содержимого делегатов), однако я не знаю, как автоматически обновлять список (и в настоящее время видимых/невидимых делегатов), когда изменения записи в модели. Из того, что я нашел до сих пор, кажется невозможным сделать это, поскольку ListView
не активно отслеживает его ListModel
.
Действительно ли это так? Если да, то можно ли решить эту проблему по-другому?
Ах, подождите. Теперь закрытие при нажатии на запись не работает ... XD Мне действительно нужно 'if-else' внутри' onClicked'. Однако это нарушает ваше решение. : -/ – rbaleksandar
Отредактировал свой ответ. Надеюсь, это сработает на этот раз :) – Yoann
Остается только проблема, что при первом загрузке «ListView» первая запись (я думаю, тот, который предварительно выбран при загрузке списка) находится в подробном представлении. – rbaleksandar