Spec-Zone.ru › Qt 6.1

Тип QML TableModel

Оборачивает простую табличную модель. Подробнее...

Заявление об импорте: import Qt.labs.qmlmodels 1.0
С тех пор: Qt 5.14
  • Список всех членов, включая унаследованные

Свойства

  • columnCount : int
  • rowCount : int
  • rows : object

Методы

  • appendRow(object row)
  • clear()
  • variant data(QModelIndex index, string role)
  • object getRow(int rowIndex)
  • QModelIndex index(int row, int column)
  • insertRow(int rowIndex, object row)
  • moveRow(int fromRowIndex, int toRowIndex, int rows)
  • removeRow(int rowIndex, int rows)
  • bool setData(QModelIndex index, string role, variant value)
  • setRow(int rowIndex, object row)

Подробное описание

Тип TableModel хранит JavaScript/JSON объекты в качестве данных для табличной модели, которую можно использовать с TableView. Он предназначен для поддержки очень простых моделей без необходимости создания подкласса QAbstractTableModel в C++.

import QtQuick 2.12
import QtQuick.Window 2.12
import Qt.labs.qmlmodels 1.0

Window {
    width: 400
    height: 400
    visible: true

    TableView {
        anchors.fill: parent
        columnSpacing: 1
        rowSpacing: 1
        boundsBehavior: Flickable.StopAtBounds

        model: TableModel {
            TableModelColumn { display: "checked" }
            TableModelColumn { display: "amount" }
            TableModelColumn { display: "fruitType" }
            TableModelColumn { display: "fruitName" }
            TableModelColumn { display: "fruitPrice" }

            // Each row is one type of fruit that can be ordered
            rows: [
                {
                    // Each property is one cell/column.
                    checked: false,
                    amount: 1,
                    fruitType: "Apple",
                    fruitName: "Granny Smith",
                    fruitPrice: 1.50
                },
                {
                    checked: true,
                    amount: 4,
                    fruitType: "Orange",
                    fruitName: "Navel",
                    fruitPrice: 2.50
                },
                {
                    checked: false,
                    amount: 1,
                    fruitType: "Banana",
                    fruitName: "Cavendish",
                    fruitPrice: 3.50
                }
            ]
        }
        delegate:  TextInput {
            text: model.display
            padding: 12
            selectByMouse: true

            onAccepted: model.display = text

            Rectangle {
                anchors.fill: parent
                color: "#efefef"
                z: -1
            }
        }
    }
}

Начальные данные строк модели задаются либо свойством rows, либо вызовом appendRow(). Каждый столбец в модели задается объявлением экземпляра TableModelColumn, где порядок каждого экземпляра определяет его индекс столбца. После того, как был выпущен сигнал Component::completed() модели, столбцы и роли будут установлены и затем будут фиксированы на протяжении всего жизненного цикла модели.

Для доступа к определенной строке можно использовать функцию getRow(). Также можно напрямую получить доступ к JavaScript-данным модели через свойство rows, но изменить данные модели таким образом нельзя.

Для добавления новых строк используйте appendRow() и insertRow(). Для изменения существующих строк используйте setRow(), moveRow(), removeRow() и clear().

Также можно изменить данные модели через делегат, как показано в приведенном выше примере:

        delegate:  TextInput {
            text: model.display
            padding: 12
            selectByMouse: true

            onAccepted: model.display = text

            Rectangle {
                anchors.fill: parent
                color: "#efefef"
                z: -1
            }
        }

Если тип данных в изменённой роли не соответствует типу устанавливаемых данных, он будет автоматически преобразован с помощью QVariant.

Поддерживаемые структуры данных строк

TableModel разработан для работы с данными JavaScript/JSON, где каждая строка — это простой объект пар ключ-значение:

{
    // Each property is one cell/column.
    checked: false,
    amount: 1,
    fruitType: "Apple",
    fruitName: "Granny Smith",
    fruitPrice: 1.50
},
// ...

Поскольку манипуляции с моделью в Qt выполняются с помощью индексов строк и столбцов, и поскольку ключи объектов не упорядочены, каждый столбец должен быть задан через TableModelColumn. Это позволяет сопоставить встроенные роли Qt с любым свойством в каждом объекте строки.

Поддерживаются сложные структуры строк, но с ограниченной функциональностью. Так как TableModel не знает, как структурирована каждая строка, он не может её манипулировать. Вследствие этого копия данных модели, хранящаяся в rows, не синхронизируется с исходными данными, которые были установлены в QML. По этим причинам TableModel полагается на пользователя для обработки простых манипуляций с данными.

Например, предположим, что вы хотите иметь несколько ролей на столбец. Один из способов сделать это — использовать источник данных, где каждая строка — это массив, а каждая ячейка — это объект. Чтобы использовать этот источник данных с TableModel, определите getter и setter:

TableModel {
    TableModelColumn {
        display: function(modelIndex) { return rows[modelIndex.row][0].checked }
        setDisplay: function(modelIndex, cellData) { rows[modelIndex.row][0].checked = cellData }
    }
    // ...

    rows: [
        [
            { checked: false, checkable: true },
            { amount: 1 },
            { fruitType: "Apple" },
            { fruitName: "Granny Smith" },
            { fruitPrice: 1.50 }
        ]
        // ...
    ]
}

Вышеприведённая строка — один из примеров сложной строки.

Примечание: Функции манипулирования строками, такие как appendRow(), removeRow() и т. д., не поддерживаются при использовании сложных строк.

Использование DelegateChooser с TableModel

Для большинства реальных случаев использования рекомендуется использовать DelegateChooser в качестве делегата TableView, использующего TableModel. Это позволяет использовать определённые роли в соответствующих делегатах. Например, фрагмент кода выше можно переписать, используя DelegateChooser следующим образом:

import QtQuick 2.12
import QtQuick.Controls 2.5
import Qt.labs.qmlmodels 1.0

ApplicationWindow {
    width: 400
    height: 400
    visible: true

    TableView {
        anchors.fill: parent
        columnSpacing: 1
        rowSpacing: 1
        boundsBehavior: Flickable.StopAtBounds

        model: TableModel {
            TableModelColumn { display: "checked" }
            TableModelColumn { display: "amount" }
            TableModelColumn { display: "fruitType" }
            TableModelColumn { display: "fruitName" }
            TableModelColumn { display: "fruitPrice" }

            // Each row is one type of fruit that can be ordered
            rows: [
                {
                    // Each property is one cell/column.
                    checked: false,
                    amount: 1,
                    fruitType: "Apple",
                    fruitName: "Granny Smith",
                    fruitPrice: 1.50
                },
                {
                    checked: true,
                    amount: 4,
                    fruitType: "Orange",
                    fruitName: "Navel",
                    fruitPrice: 2.50
                },
                {
                    checked: false,
                    amount: 1,
                    fruitType: "Banana",
                    fruitName: "Cavendish",
                    fruitPrice: 3.50
                }
            ]
        }
        delegate: DelegateChooser {
            DelegateChoice {
                column: 0
                delegate: CheckBox {
                    checked: model.display
                    onToggled: model.display = checked
                }
            }
            DelegateChoice {
                column: 1
                delegate: SpinBox {
                    value: model.display
                    onValueModified: model.display = value
                }
            }
            DelegateChoice {
                delegate: TextField {
                    text: model.display
                    selectByMouse: true
                    implicitWidth: 140
                    onAccepted: model.display = text
                }
            }
        }
    }
}

Самые специфичные делегаты объявляются первыми: столбцы с индексами 0 и 1 имеют типы данных bool и integer соответственно, поэтому они используют CheckBox и SpinBox. Остальные столбцы могут просто использовать TextField, и поэтому этот делегат объявляется последним в качестве резервного варианта.

См. также TableModelColumn, TableView и QAbstractTableModel.

Документация по свойствам

[только для чтения] columnCount : int

Это свойство только для чтения содержит количество столбцов в модели.

Количество столбцов фиксировано на протяжении всего жизненного цикла модели после установки свойства rows или вызова appendRow() в первый раз.

[только для чтения] rowCount : int

Это свойство только для чтения содержит количество строк в модели.

Это значение изменяется всякий раз, когда строки добавляются или удаляются из модели.

rows : object

Это свойство содержит данные модели в виде массива строк:

            rows: [
                {
                    // Each property is one cell/column.
                    checked: false,
                    amount: 1,
                    fruitType: "Apple",
                    fruitName: "Granny Smith",
                    fruitPrice: 1.50
                },
                {
                    checked: true,
                    amount: 4,
                    fruitType: "Orange",
                    fruitName: "Navel",
                    fruitPrice: 2.50
                },
                {
                    checked: false,
                    amount: 1,
                    fruitType: "Banana",
                    fruitName: "Cavendish",
                    fruitPrice: 3.50
                }
            ]

См. также getRow(), setRow(), moveRow(), appendRow(), insertRow(), clear(), rowCount и columnCount.

Документация по методам

appendRow(object row)

Добавляет новую строку в конец модели со значениями (ячейками) в row.

model.appendRow({
    checkable: true,
    amount: 1,
    fruitType: "Pear",
    fruitName: "Williams",
    fruitPrice: 1.50,
})

См. также insertRow(), setRow() и removeRow().

clear()

Удаляет все строки из модели.

См. также removeRow().

variant data(QModelIndex index, string role)

Возвращает данные из ячейки таблицы по заданному index, относящиеся к заданной role.

См. также setData() и index().

object getRow(int rowIndex)

Возвращает строку по индексу rowIndex в модели.

Обратите внимание, что это эквивалентно прямому доступу к строке через свойство rows:

Component.onCompleted: {
    // These two lines are equivalent.
    console.log(model.getRow(0).display);
    console.log(model.rows[0].fruitName);
}

Примечание: возвращаемый объект нельзя использовать для изменения содержимого модели; используйте setRow() вместо этого.

См. также setRow(), appendRow(), insertRow(), removeRow() и moveRow().

QModelIndex index(int row, int column)

Возвращает объект QModelIndex, ссылающийся на заданную row и column, который можно передать функции data() для получения данных из этой ячейки или в setData() для изменения содержимого этой ячейки.

import QtQml 2.14
import Qt.labs.qmlmodels 1.0

TableModel {
    id: model

    TableModelColumn { display: "fruitType" }
    TableModelColumn { display: "fruitPrice" }

    rows: [
        { fruitType: "Apple", fruitPrice: 1.50 },
        { fruitType: "Orange", fruitPrice: 2.50 }
    ]

    Component.onCompleted: {
        for (var r = 0; r < model.rowCount; ++r) {
            console.log("An " + model.data(model.index(r, 0)).display +
                        " costs " + model.data(model.index(r, 1)).display.toFixed(2))
        }
    }
}

См. также QModelIndex и связанные классы в QML и data().

insertRow(int rowIndex, object row)

Добавляет новую строку в список моделей в позиции rowIndex со значениями (ячейками) в row.

model.insertRow(2, {
    checkable: true, checked: false,
    amount: 1,
    fruitType: "Pear",
    fruitName: "Williams",
    fruitPrice: 1.50,
})

rowIndex должен указывать на существующий элемент в списке или на позицию после конца списка (эквивалентно appendRow()).

См. также appendRow(), setRow(), removeRow() и rowCount.

moveRow(int fromRowIndex, int toRowIndex, int rows)

Перемещает rows из индекса fromRowIndex в индекс toRowIndex.

Диапазоны from и to должны существовать; например, чтобы переместить первые 3 элемента в конец списка:

model.moveRow(0, model.rowCount - 3, 3)

См. также appendRow(), insertRow(), removeRow() и rowCount.

removeRow(int rowIndex, int rows = 1)

Удаляет заданное количество rows в позиции rowIndex из модели.

См. также clear() и rowCount.

bool setData(QModelIndex index, string role, variant value)

Вставляет или обновляет поле данных, обозначенное role, в ячейке таблицы по заданному index со значением value. Возвращает true при успешном выполнении, false в противном случае.

См. также data() и index().

setRow(int rowIndex, object row)

Изменяет строку в позиции rowIndex в модели на row.

Все столбцы/ячейки должны быть присутствовать в row, и в правильном порядке.

model.setRow(0, {
    checkable: true,
    amount: 1,
    fruitType: "Pear",
    fruitName: "Williams",
    fruitPrice: 1.50,
})

Если rowIndex равно rowCount(), то новая строка добавляется в модель. В противном случае, rowIndex должен указывать на существующую строку в модели.

См. также appendRow(), insertRow() и rowCount.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qml-qt-labs-qmlmodels-tablemodel.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API