Skip to main content
Перейти до вмісту

Списки

Панель перегляду списку може спростити для вас динамічний показ багатьох компонентів.

Панелі списків можуть допомогти у показі об'єктів на основі моделі у привабливий спосіб. Щоб правильно користуватися панеллю списку, вам слід стежити за трьома речима:

  1. Моделлю, яка містить дані, які має бути показано на вашій панелі списку
  2. Делегата, який визначає, як буде показано кожне з елементів моделі
  3. Самої панелі списку, на якій буде показано відомості щодо моделі, відповідно до параметрів делегата

Якщо вам потрібні додаткові пояснення, у документації 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У більшості випадків для прототипізації
Модель масиву JavaScriptmodel.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