Тип 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 из модели.
bool setData(QModelIndex index, string role, variant value)
Вставляет или обновляет поле данных, обозначенное role, в ячейке таблицы по заданному index со значением value. Возвращает true при успешном выполнении, false в противном случае.
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