Я создаю таблицу, используя новое табличное представление qml (Qt 5.12). Я могу создать модель на С++ и заполнить модель в табличном формате вместе с полосой прокрутки. Как добавить заголовки столбцов в эту таблицу? Код:
import QtQuick 2.12
import QtQuick.Controls 2.5
import Qt.labs.qmlmodels 1.0
//import QtQuick.Controls.Styles 1.4
import TableModel 0.1
Rectangle {
id:table
border.width: 3
border.color: 'dark blue'
QtObject{
id:internals
property int rows:0
property int col:0
property int colwidth:0
property var columnName:[]
}
function setRows(num){ internals.rows = num}
function setCols(num){ internals.col = num}
function setColWidth(num){internals.colwidth = num}
function setColNames(stringlist){
if (stringlist.length > 1)
internals.col = stringlist.length
dataModel.setColumnName(stringlist);
}
function addRowData(stringlist){
var len = stringlist.length
if (len >0)
{
dataModel.addData(stringlist)
}
}
TableModel {
id:dataModel
}
TableView{
id:tbl
anchors.top: headerCell
anchors.fill: parent
//columnSpacing: 1
//rowSpacing: 1
clip: true
ScrollBar.horizontal: ScrollBar{}
ScrollBar.vertical: ScrollBar{}
model:dataModel
Component{
id:datacell
Rectangle {
implicitWidth: 100
implicitHeight: 20
color: 'white'
border.width: 1
border.color: 'dark grey'
Text {
id:txtbox
anchors.fill: parent
wrapMode: Text.NoWrap
clip: true
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
text: display
}
}
}
}
function init(){
console.info("Calling init")
tbl.delegate= datacell
}
}
@folibis — это старый TableView, OP использует новый.
А, ладно, не обратил внимания. Как насчет реализации данные заголовка в модели?
В настоящее время TableView не имеет заголовков, поэтому вы должны создать его, в этом случае используйте Row, Column и Repeater.
С другой стороны, вы должны реализовать метод headerData, и вы должны сделать это Q_INVOKABLE.
class TableModel : public QAbstractTableModel
{
Q_OBJECT
public:
// ...
Q_INVOKABLE QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
// ...
TableView {
id: tableView
model: table_model
// ...
Row {
id: columnsHeader
y: tableView.contentY
z: 2
Repeater {
model: tableView.columns > 0 ? tableView.columns : 1
Label {
width: tableView.columnWidthProvider(modelData)
height: 35
text: table_model.headerData(modelData, Qt.Horizontal)
color: '#aaaaaa'
font.pixelSize: 15
padding: 10
verticalAlignment: Text.AlignVCenter
background: Rectangle { color: "#333333" }
}
}
}
Column {
id: rowsHeader
x: tableView.contentX
z: 2
Repeater {
model: tableView.rows > 0 ? tableView.rows : 1
Label {
width: 60
height: tableView.rowHeightProvider(modelData)
text: table_model.headerData(modelData, Qt.Vertical)
color: '#aaaaaa'
font.pixelSize: 15
padding: 10
verticalAlignment: Text.AlignVCenter
background: Rectangle { color: "#333333" }
}
}
}
Полный пример вы найдете здесь.
Спасибо @eyllanesc за решение. Что такое modelData в файле qml?
@anujchauhan Если вы заметили, что модель ретранслятора представляет собой число, поэтому оно эквивалентно списку от 0 до n-1, где n — это число, которое указывает, поэтому данные равны 0, 1, 2, ..., n- 1, а modelData — это именно то, что нужно. Так что вам не нужно ничего определять, modelData будет создан автоматически. Чтение doc.qt.io/qt-5/qtquick-modelviewsdata-modelview.html#repeatrs
Большое спасибо @eyllanesc Теперь с вашей помощью я могу получить заголовок столбца.
Есть еще одна функция, которую я пытаюсь реализовать. Как я могу выбрать полную строку щелчком мыши или нажатием клавиши ввода, а при выборе цвет строки должен измениться? Любая идея о том, как реализовать эту функцию?
@anujchauhan Я еще не знаю модель выбора для этого TableView, поэтому вам придется реализовать эту логику самостоятельно.
Можно ли изменить размер столбца?
Я новичок в QML. Я много раз приходил к ответу Эйлланеск из-за своей борьбы с новый TableView (qt 5.12+), поэтому я хочу поблагодарить вас и поделиться тем, что помогло мне еще больше. Это видео: Шон Рутледж — TableView и DelegateChooser: новое в Qt 5.12 часть Qt Virtual Tech Summit 2019
Это немного длинно, но он покрывает
различия между старым и новым TableView
как создать модель универсальный для представлений
заголовки с изменяемым размером
разное представление для каждого типа столбца — DelegateChooser
сортируемые столбцы
изменение порядка столбцов
Если вы используете Qt 5.15, вы можете использовать HorizontalHeaderView для меток столбцов.
https://doc.qt.io/qt-5/qml-qtquick-controls2-horizontalheaderview.html
Также есть VerticalHeaderView для маркировки строк.
https://doc.qt.io/qt-5/qml-qtquick-controls2-verticalheaderview.html
Как сказано в документах Qt: Вы предоставляете заголовок и размер заголовка столбца, добавляя TableViewColumn, поэтому вам просто нужно добавить один или несколько элементов ТаблицаViewColumn.