Как создать табличное представление (Qt5.12) с моделью в виде listModel, которая может содержать переменное число столбцов? - PullRequest
0 голосов
/ 04 апреля 2019

Я создаю таблицу с несколькими строками и столбцами. Как я могу использовать Qml TableView для создания таблицы с несколькими строками и столбцами?

Я пытался использовать более старую реализацию tableview, но теперь хочу создать ее, используя новую таблицу, представленную в Qt 5.12. Ниже приведен пример кода моей старой реализации

QtObject{
    id:internals
    property int rows:0
    property int col:0
    property int colwidth:0
    property var columnName:[]
}    
ListModel{
        id: libModel
    }
TableView{
    id:tblview
    height:parent.height
    width: parent.width
    model: libModel

    style:TableViewStyle{
        itemDelegate:
            Rectangle {
            border.width: 1
            border.color: 'light grey'
            anchors.rightMargin: 1
            Text {
                id: textItem
                anchors.fill: parent
                verticalAlignment: Text.AlignVCenter
                horizontalAlignment: styleData.textAlignment
                anchors.leftMargin: 12
                text: styleData.value
                elide: Text.ElideRight
                color: textColor
                renderType: Text.NativeRendering
            }
        }
    }

    resources: {
        var temp =[]
        console.log("Column Cout"+internals.col)
        for(var i=0; i<internals.col;i++)
        {
            console.log("Creating a column")
            temp.push(columnComponent.createObject(tblview,{"role":internals.columnName[i],
                                                       "title":internals.columnName[i]
                                                   }))
        }
        //  var objct = temp[temp.length-1]
        // objct.width = tblview.width - ((internals.col -1)*internals.colwidth)
        return temp
    }
    Component{
        id:columnComponent
        TableViewColumn{width: internals.colwidth}
    }

1 Ответ

1 голос
/ 04 апреля 2019

Я бы рекомендовал использовать модель C ++, полученную из QAbstractTableModel, как показано в примере .

Для делегатов используйте DelegateChooser и DelegateChoice.

К сожалению, документация, касающаяся TableView и DelegateChooser, все еще нуждается в улучшении:

Пока это не добавлено, я бы рекомендовал взглянуть на ручной тест модели хранения .Цитирование кода делегата:

TableView {
    id: table
    anchors.fill: parent
    anchors.margins: 10
    clip: true
    model: StorageModel { }
    columnSpacing: 1
    rowSpacing: 1
    delegate: DelegateChooser {
        role: "type"
        DelegateChoice {
            roleValue: "Value"
            delegate: Rectangle {
                color: "tomato"
                implicitWidth: Math.max(100, label.implicitWidth + 8)
                implicitHeight: label.implicitHeight + 4

                Rectangle {
                    x: parent.width - width
                    width: value * parent.width / valueMax
                    height: parent.height
                    color: "white"
                }

                Text {
                    id: label
                    anchors.baseline: parent.bottom
                    anchors.baselineOffset: -4
                    anchors.left: parent.left
                    anchors.leftMargin: 4
                    text: valueDisplay + " of " + valueMaxDisplay + " " + heading
                }
            }
        }
        DelegateChoice {
            roleValue: "Flag"
            // We could use a checkbox here but that would be another component (e.g. from Controls)
            delegate: Rectangle {
                implicitWidth: checkBox.implicitWidth + 8
                implicitHeight: checkBox.implicitHeight + 4
                Text {
                    id: checkBox
                    anchors.baseline: parent.bottom
                    anchors.baselineOffset: -4
                    anchors.left: parent.left
                    anchors.leftMargin: 4
                    text: (checkState ? "☑ " : "☐ ") + heading
                }
            }
        }
        DelegateChoice {
            // roleValue: "String" // default delegate
            delegate: Rectangle {
                implicitWidth: stringLabel.implicitWidth + 8
                implicitHeight: stringLabel.implicitHeight + 4
                Text {
                    id: stringLabel
                    anchors.baseline: parent.bottom
                    anchors.baselineOffset: -4
                    anchors.left: parent.left
                    anchors.leftMargin: 4
                    text: display
                }
            }
        }
    }
...