Списки
Панелі списків можуть допомогти у показі об'єктів на основі моделі у привабливий спосіб. Щоб правильно користуватися панеллю списку, вам слід стежити за трьома речима:
- Моделлю, яка містить дані, які має бути показано на вашій панелі списку
- Делегата, який визначає, як буде показано кожне з елементів моделі
- Самої панелі списку, на якій буде показано відомості щодо моделі, відповідно до параметрів делегата
Якщо вам потрібні додаткові пояснення, у документації Qt є інформативна сторінка щодо цього питання.
Базові дані щодо моделей та панелей перегляду
У панелі списку є дві ключові властивості, на які нам слід звернути увагу:
- model, яка приймає дані або
idоб'єкта, який містить дані - delegate, яка приймає компонент, якими ми скористаємося для показу даних у моделі
Модель є невидимою, оскільки вона лише містить дані. Типово, делегат буде загорнуто до Component, щоб його можна було використати повторно: він слугує як шаблон того, як створити екземпляр кожного делегата.
Тут наведено приклад, який містить точно одну панель перегляду списку, одну модель та один делегат, з використанням Kirigami.SubtitleDelegate:
import QtQuick
import QtQuick.Controls as Controls
import org.kde.kirigami as Kirigami
Kirigami.ApplicationWindow {
title: "List of Plasma products"
width: 600
height: 400
pageStack.initialPage: Kirigami.ScrollablePage {
ListView {
anchors.fill: parent
model: plasmaProductsModel
delegate: listDelegate
}
ListModel {
id: plasmaProductsModel
ListElement { product: "Plasma Desktop"; target: "desktop" }
ListElement { product: "Plasma Mobile"; target: "mobile" }
ListElement { product: "Plasma Bigscreen"; target: "TVs" }
}
Component {
id: listDelegate
Controls.ItemDelegate {
width: ListView.view.width
text: `${model.product} is KDE software developed for ${model.target} stored at index ${model.index} of this list`
}
}
}
}І точно той самий приклад, вбудований:
import QtQuick
import QtQuick.Controls as Controls
import org.kde.kirigami as Kirigami
Kirigami.ApplicationWindow {
title: "List of Plasma products (inline)"
width: 600
height: 400
pageStack.initialPage: Kirigami.ScrollablePage {
ListView {
anchors.fill: parent
model: ListModel {
id: plasmaProductsModel
ListElement { product: "Plasma Desktop"; target: "desktop" }
ListElement { product: "Plasma Mobile"; target: "mobile" }
ListElement { product: "Plasma Bigscreen"; target: "TVs" }
}
delegate: Controls.ItemDelegate {
width: ListView.view.width
text: `${model.product} is KDE software developed for ${model.target} stored at index ${model.index} of this list`
}
}
}
}Розбираємося із моделями
Модель містить дані, які буде використано для заповнення панелі перегляду списку. Для різних способів використання моделей передбачено різні способи доступу до даних:
| СПОСІБ ВИКОРИСТАННЯ | ДОСТУП | УМОВИ ВИКОРИСТАННЯ |
|---|---|---|
| Моделі Qt із декількома ролями | model.index, model.somerole | У більшості випадків |
| Моделі Qt з однією роллю | model.index, model.somerole, model.modelData | У більшості випадків для прототипізації |
| Модель масиву JavaScript | model.index, model.modelData | Для прототипізації |
| Цілочисельна модель | model.index, model.modelData | Для прототипізації |
Ви можете ознайомитися із іншими способами використання моделей у документації Qt.
У наведеній вище таблиці «Моделі Qt» означають і C++-специфічні моделі, подібні до QAbstractListModel, і QML-специфічні моделі, зокрема ListModel. На цій сторінці підручника акцент зроблено на QML-специфічних моделях. Далі ми наведемо настанови щодо з'єднання моделей C++ із QML за допомогою QAbstractListModel.
Властивість model.index зроблено доступною для будь-якої моделі. Вона містить індекс (позиція) кожного делегата. Її можна скоротити до index для зручності.
Властивість model.якась_роль, про яку ми згадували вище, є лише замінником. Це не специфічна властивість, яка надходить від QML: записом якась_роль може бути будь-яка роль, яку визначено моделлю. У першому прикладі коду на цій сторінці, який показано над таблицею, модельplasmaProductsModel містить ролі product і target, доступ до яких можна здійснювати за допомогою model.product і model.target, відповідно.
Так само, як model.index можна скоротити до index, кожну властивість model.якась_роль можна скоротити до простого якась_роль (наприклад, product) для зручності, але рекомендуємо перетворювати їх до потрібних властивостей:
import QtQuick
import QtQuick.Controls as Controls
import org.kde.kirigami as Kirigami
Kirigami.ApplicationWindow {
title: "List of Plasma products (shortened with required properties)"
width: 600
height: 400
pageStack.initialPage: Kirigami.ScrollablePage {
ListView {
anchors.fill: parent
model: plasmaProductsModel
delegate: listDelegate
}
ListModel {
id: plasmaProductsModel
ListElement { product: "Plasma Desktop"; target: "desktop" }
ListElement { product: "Plasma Mobile"; target: "mobile" }
ListElement { product: "Plasma Bigscreen"; target: "TVs" }
}
Component {
id: listDelegate