Roson的Qt之旅#99 QML表格控件-TableView

158 篇文章 31 订阅

TableView类似于QML中的ListView,类似Widget中的QTableView,它增加了滚动条、选择和可调整大小的标题部分。与ListView一样,每一行的数据都是通过一个模型提供的:

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import QtQuick.Controls 1.4

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ListModel{
        id:listModel
        ListElement{title:"A";author:"Xiaoming"}
        ListElement{title:"B";author:"Liling"}
        ListElement{title:"C";author:"ABing"}
    }

    TableView{
        anchors.fill: parent
        model: listModel

        TableViewColumn{
        role:"title"
        title: "标题"
        width: 100
        }

        TableViewColumn{
            role:"author"
            title: "作者"
            width: 200
        }
    }

}

 


上面的代码使用了ListModel作为数据模型来提供数据,其中每一行数据使用一个ListElement对象表示,这里指定了title和author两个字段。要想使用模型中的数据,在TableView 中需要使用 TableViewColumn来指定模型中的字段,每一个TableViewColumn对应一个字段,其中需要指定role即模型中字段名称,而title是要显示的每一列的列头。TableViewColumn类型中还包含了visible、width resizable、mova-ble,delegate等属性,其中delegate属性可以给特定的列使用委托来指定显示方式,在委托中可以访问特定的属性。

TableView可以通过itemDelegate属性,使用委托来绘制指定单元格。它与TableViewColumn的delegate效果相同。另外还可以通过rowDelegate和 headerDelegate 来使用委托绘制行或列头。TableView类型还提供了一些常用的函数,比如ad-dColumn() ,getColumn() 、 insertColumn() 、 removeColumn()、rowAt(x,y)等,进行相关操作。另外,当行被点击后会发射clicked()或doubleClick()信号。

TableView视图本身不提供排序。这必须在模型本身上完成。但是,您可以在模型上提供排序,并在标题上启用排序指示器。

  • int sortIndicatorColumn-当前排序列的索引
  • bool sortIndicatorVisible-是否应该启用排序指示器
  • enum sortIndicatorOrder-Qt.AscendingOrder还是Qt.DescendingOrder取决于状态

 
你可以通过分配一个TableViewStyle来为TableView创建一个自定义外观。 

下面的代码,演示通过itemDelegate设置表格样式:

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import QtQuick.Controls 1.4

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ListModel{
        id:listModel
        ListElement{title:"A";author:"Xiaoming"}
        ListElement{title:"B";author:"Liling"}
        ListElement{title:"C";author:"ABing"}
    }

    TableView{
        anchors.fill: parent
        model: listModel

        TableViewColumn{
        role:"title"
        title: "标题"
        width: 100
        }

        TableViewColumn{
            role:"author"
            title: "作者"
            width: 200
        }

        itemDelegate: Item {
            Text {
                anchors.horizontalCenter: parent.horizontalCenter
                color:styleData.selected? "red":"blue"
                font.pixelSize: 10
                text: styleData.column == 1? "column 1":styleData.value
            }
        }

        onClicked: {
            console.debug(row);
        }
    }

}

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen Roson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值