QML tableView表格自定义

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

  Rectangle {
            z: 10
            id: tableView
            width: dpH(919)
            height: dpH(475)
            anchors {
                top: parent.top
                topMargin: dpH(88)
                horizontalCenter: parent.horizontalCenter
            }
            Item {
                id: control
                implicitHeight: parent.height
                implicitWidth: parent.width

                //表头行高
                property int headerHeight: dpH(48)
                //行高
                property int rowHeight: dpH(48)
                //滚动条
                property color scrollBarColor: "#E5E5E5"
                property int scrollBarWidth: 7
                //列宽
                property variant columnWidthArr: [control.width
                    / 3, control.width / 3, control.width / 3]

                property var horHeader: ["名称", "修改日期", "来源"]
                property int selected: -1
                property var datas: [{
                        "checked": false,
                        "id": 1,
                        "name": "汽车曲轴分拣项目1",
                        "time": "2020/1/14    17:33",
                        "source": "相机建模"
                    }, {
                        "checked": false,
                        "id": 2,
                        "name": "汽车曲轴分拣项目2",
                        "time": "2020/1/14    17:33",
                        "source": "相机建模"
                    }, {
                        "checked": false,
                        "id": 3,
                        "name": "汽车曲轴分拣项目3",
                        "time": "2020/1/14    17:33",
                        "source": "相机建模"
                    }, {
                        "checked": false,
                        "id": 4,
                        "name": "汽车曲轴分拣项目4",
                        "time": "2020/1/14    17:33",
                        "source": "相机建模"
                    }, {
                        "checked": false,
                        "id": 5,
                        "name": "汽车曲轴分拣项目5",
                        "time": "2020/1/14    17:33",
                        "source": "相机建模"
                    }, {
                        "checked": false,
                        "id": 6,
                        "name": "汽车曲轴分拣项目6",
                        "time": "2020/1/14    17:33",
                        "source": "相机建模"
                    }, {
                        "checked": false,
                        "id": 7,
                        "name": "汽车曲轴分拣项目7",
                        "time": "2020/1/14    17:33",
                        "source": "相机建模"
                    }, {
                        "checked": false,
                        "id": 8,
                        "name": "汽车曲轴分拣项目8",
                        "time": "2020/1/14    17:33",
                        "source": "相机建模"
                    }, {
                        "checked": false,
                        "id": 9,
                        "name": "汽车曲轴分拣项目9",
                        "time": "2020/1/14    17:33",
                        "source": "相机建模"
                    }, {
                        "checked": false,
                        "id": 10,
                        "name": "汽车曲轴分拣项目10",
                        "time": "2020/1/14    17:33",
                        "source": "相机建模"
                    }, {
                        "checked": false,
                        "id": 11,
                        "name": "汽车曲轴分拣项目11",
                        "time": "2020/1/14    17:33",
                        "source": "相机建模"
                    }]

                //展示数据
                TableView {
                    id: table
                    anchors {
                        fill: parent
                        topMargin: control.rowHeight
                    }

                    clip: true
                    boundsBehavior: Flickable.StopAtBounds
                    columnSpacing: 0
                    rowSpacing: 0

                    //内容行高
                    rowHeightProvider: function (row) {
                        return control.headerHeight
                    }
                    //内容列的列宽
                    columnWidthProvider: function (column) {
                        return control.columnWidthArr[column]
                    }
                    ScrollBar.vertical: ScrollBar {
                        id: scroll_vertical
                        anchors.right: parent.right
                        anchors.rightMargin: 0
                        contentItem: Rectangle {
                            visible: (scroll_vertical.size < 1.0)
                            implicitWidth: control.scrollBarWidth
                            color: control.scrollBarColor
                        }
                    }

                    ScrollBar.horizontal: ScrollBar {
                        id: scroll_horizontal
                        anchors.bottom: parent.bottom
                        anchors.bottomMargin: 0
                        anchors.left: parent.left
                        anchors.leftMargin: 0
                        contentItem: Rectangle {
                            visible: (scroll_horizontal.size < 1.0)
                            implicitHeight: control.scrollBarWidth
                            color: control.scrollBarColor
                        }
                    }

                    model: TableModel {

                        TableModelColumn {
                            display: "name"
                        }
                        TableModelColumn {

                            display: "time"
                        }
                        TableModelColumn {
                            display: "source"
                        }

                        rows: control.datas
                    }

                    delegate: Rectangle {
                        color: control.selected === row ? "#EAF1FF" : "white" //点击改变行背景颜色

                        Text {
                            anchors.fill: parent
                            verticalAlignment: Text.AlignVCenter
                            horizontalAlignment: Text.AlignHCenter
                            text: display
                            font.pixelSize: dpH(15)
                            color: "#707070"
                        }
                        Rectangle {
                            color: "#E5E5E5"
                            width: parent.width
                            height: 1
                            anchors {
                                bottom: parent.bottom

                            }
                        }

                        MouseArea {
                            anchors.fill: parent

                            onClicked: {
//注意增删改查只需要对control.datas原数组修改再赋值给table.model.rows即可更新表格视图
                                control.selected = row
//例 点击任意一行增加一条数据

                                control.datas.push({
                                                       "checked": false,
                                                       "id": table.model.rows.length + 1,
                                                       "name": "汽车曲轴分拣项目"
                                                               + (table.model.rows.length + 1),
                                                       "time": "2020/1/14    17:33",
                                                       "source": "相机建模"
                                                  })
                                table.model.rows = control.datas
                                console.log(table.model.rows.length,JSON.stringify(table.model.rows[row]))
                            }
                        }
                    }
                }
        //表头样式

                Item {
                    id: header_horizontal
                    anchors {
                        left: parent.left
                        right: parent.right
                    }
                    height: control.rowHeight
                    z: 2

                    Row {
                        id: header_horizontal_row
                        anchors.fill: parent
                        leftPadding: -table.contentX
                        clip: true
                        spacing: 0

                        Repeater {
                            model: table.columns > 0 ? table.columns : 0

                            Rectangle {
                                id: header_horizontal_item
                                width: table.columnWidthProvider(
                                           index) + table.columnSpacing
                                height: control.rowHeight-1
                                color: "#F8F8F8"

                                Text {
                                    anchors.centerIn: parent
                                    text: control.horHeader[index]
                                    font.pixelSize: dpH(18)
                                    color: "#707070"
                                }
                                Rectangle {
                                    height: 1
                                    width: parent.width
                                    anchors.bottom: parent.bottom
                                    color: "#E5E5E5"
                                }
                                Rectangle {
                                    height: 1
                                    width: parent.width
                                    anchors.top: parent.top
                                    color: "#E5E5E5"
                                }
                            }
                        }
                    }
                }
            }
        }

 

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: QML中的TableView是一种常用的用于显示和编辑表格数据的控件,它允许我们使用TableModel为其提供数据。而自定义委托是为了满足不同的数据显示需求而创建的一种方式。 使用QML中的TableView默认情况下,每个单元格都会使用内置的委托来显示数据,但有时我们可能需要根据特定需求对数据进行自定义显示。这时,我们可以通过自定义委托来实现。 首先,我们需要创建一个自定义的Delegate组件,用于定义我们想要的数据显示方式。在Delegate中可以定义各种需要显示的元素,如文本框、按钮等。 接下来,我们需要在TableView的columns中指定使用自定义的委托。可以通过设置column的delegate属性为我们创建的自定义Delegate来实现。 自定义Delegate的使用方法可以参考以下示例代码: ``` // 创建自定义的Delegate组件 Item { id: myDelegate // 自定义委托中的元素(例如,一个文本框) Text { text: styleData.value // 根据数据显示元素内容 } } // 在TableView中使用自定义委托 TableView { id: myTableView // ... // 定义列,并使用自定义委托 TableViewColumn { role: "column1" // 数据模型中的角色名 title: "列1" // 列标题 delegate: myDelegate // 使用自定义的委托 } // ... } ``` 上述代码中,首先创建了一个自定义Delegate组件(myDelegate),并在其中定义了一个文本框用于显示数据。然后,在TableView的columns中指定了一个列,设置其delegate属性为myDelegate。 使用自定义Delegate后,TableView会使用我们定义的委托来显示相应的单元格数据。 这就是通过QML中的TableView自定义委托的基本方法。使用自定义委托,我们可以根据具体需求,灵活地定制数据的显示方式,以满足不同的界面展示要求。 ### 回答2: QML TableView是用于展示表格数据的视图元素,通过自定义委托,可以对单元格进行个性化的展示和交互操作。 要自定义委托,首先需要定义一个自定义的Item,可以继承自Item或者其他适合的控件。在自定义Item中,可以添加自定义的布局、样式和交互行为,以及展示需要的数据。 在TableView的每个单元格中,可以使用delegate属性绑定自定义的Item,将其设置为单元格的委托。这样,每个单元格就会使用自定义的Item来展示和交互。 在自定义Item中,可以使用数据模型中的role来绑定展示的数据,通过role的值来获取对应的数据,并进行展示和处理。可以根据具体需求,对数据进行格式化、计算等操作,并将结果展示在自定义的Item中。 另外,还可以在自定义Item的相应事件中添加交互逻辑。例如,可以在鼠标点击事件或者键盘事件中,获取当前点击的单元格位置、获取选中的数据等,根据业务需求来处理。 自定义委托的好处是可以灵活地定制每个单元格的展示和交互方式,以适应不同的场景和需求。通过设置特定的样式和交互逻辑,可以让TableView的数据展示更加美观和人性化,提升用户体验。 总之,通过在QML TableView中使用自定义委托,可以个性化定制单元格的展示和交互方式,使得表格数据在界面上更加灵活和美观。 ### 回答3: QML中的TableView是用于显示二维表格数据的控件,其默认的委托是用于显示数据的,默认情况下,每个单元格显示为一个默认的Text控件。 如果我们想要自定义委托,可以通过设置TableView的delegate属性来实现。自定义委托可以让我们对单元格的显示方式进行个性化设置,例如改变字体、颜色、布局等。 在自定义委托时,我们可以使用DelegateModel来定义数据模型,然后在TableView的delegate属性中指定该模型。DelegateModel是用于定义每个单元格的数据和样式的,可以通过设置其属性来实现个性化定制。 在自定义委托时,我们可以定义一个自定义的Component来指定单元格中的内容和样式,然后将该Component赋值给DelegateModel的delegate属性。在该Component中,可以通过子项来访问单元格中的数据,并通过设置其属性来控制显示方式。 除了自定义委托,我们还可以通过设置TableView的itemDelegate属性来实现单元格的个性化显示。itemDelegate是一个ItemDelegate类型的对象,可以在其中定义单元格的显示方式,并将其赋值给TableView的itemDelegate属性。 总之,QMLTableView控件支持自定义委托,可以通过设置delegate或itemDelegate属性来实现个性化的单元格显示。我们可以使用DelegateModel来定义数据模型,并在其中设置单元格的内容和样式。通过自定义Component或ItemDelegate,我们可以对单元格的显示方式进行定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值