QML TableView 使用详解

article/2025/8/26 14:37:51

目录

一、—个简单的TableView实例

二、TableViewColumn 属性讲解

三、定制表格外观

  • 3.1 itemDelegate
  • 3.2 rowDelegate
  • 3.3 headerDelegate
  • 3.4 定制表格外观后的示例

四、动态增删改查 TabelView

TableView 就是 Qt Quick 为表格式呈现数据提供的组件。想必兄台用过 Excel,可以藉此想象下 TableView 的效果。

TableView 与 ListView 类似,相比之下多了滚动条、挑选、可调整尺寸的表头等特性。 它的数据也通过 Model 来提供,你可以使用 ListModel、XmlListModel,也可以使用 C++ 中从 QAbstractltemModel、QAbstractTableModel 等继承而实现的 Model。

使用 ListView 也可以将数据呈现为表格样式,不过稍微有些复杂,尤其是 delegate 的定义,当数据有很多列(比如播放列表、进销存管理、学生成绩表等)时,就会很复杂,再要有排序之类的操作,那就……此时就是 TableView 的用武之地了。

一、—个简单的TableView实例

下面是前面讲 ListView 时的示例,采用 TableView 来重写一下。QML 文件 phone_table_ simple.qml 的内容如下:

import QtQuick 2.0
import QtQuick.Window 2.3
import QtQuick.Controls 1.2Window {width: 360height: 360visible: trueTableView{id: phoneTableanchors.fill: parentfocus: true// TableViewColumn 描述表格的每一列TableViewColumn{role: "name"; title: "Name"; width: 80; elideMode: Text.ElideRight;}TableViewColumn{role: "cost"; title: "Cost"; width: 100;}TableViewColumn{role: "manufacture"; title: "Manufacture"; width: 140;}model: ListModel{id: phoneModelListElement{name: "rongyao2";cost: "4900";manufacture: "huawei"}ListElement{name: "s6";cost: "4800";manufacture :"sumsung"}ListElement{name: "apple5"cost: "3300"manufacture: "apple"}ListElement{name: "Mi5"cost: "3200"manufacture: "xiaomi"}} // model is end}
}

效果如下图所示:
在这里插入图片描述

二、TableViewColumn 属性讲解

定义了 TableViewColumn,描述表格的每一列,这是必需的,否则表格无法显示。示例中用到 role、title、width 三个属性,这是要使用 TableViewColumn 的最小属性集,role 对应 Model 中 ListElement 中的 role-name,正是这个属性完成了二维表格与一维 Model 之间的数据映射;title 是表头中一列的标题;width 定义列宽。

role、title、width

这三个属性,是要使用 TableViewColumn 的最小属性集,role 对应 Model 中 ListElement 中的 role-name,正是这个属性完成了二维表格与一维 Model 之间的数据映射;title 是表头中一列的标题;width 定义列宽;

resizable

定义一列的宽度是否可以调整,默认值为 true;

movable

属性定义是否可以拖动一列的位置, 默认值为 true;

horizontalAlignment

指定列标题文本的对齐方式,可以取 Text.AlignLeft (默认值)、Text.AlignRight、Text.AlignHCenter、Text.AlignJustify 四个值中的一个;

elideMode

指定标题不能完整显示时的省略方式,可以取 Text.ElideRight (默认值)、Text.ElideLeft、 Text.ElideMiddle、Text.ElideNone 四个值中的一个;

visible

布尔值,指定表格的一列是否显示,默认值为 true。

TableViewColumn 的最后一个属性是 delegate,指定一个组件用来绘制这一列,示例中没有指定,釆取了默认值;在你提供的 delegate 中,可以访问 styleData 的部分属性来获知相关信息。styleData 是 TableView 相关的风格数据,有很多属性。下面所列的属性可以在 TableViewColumn 的 delegate 中访问:

styleData.selected,当 Item 选中时为 true。
styleData.value,当前 Item 的文本。
styleData.textColor,Item 的默认颜色。
styleData.row,行索引。
styleData.column,列索引。
styleData.elideMode,列省略模式。
styleData.textAlignment,列文本对齐方式。

如你所见,我们仅仅是设置了 model,定义了表格的列属性,就得到了一个看起来还不错的表格,代码比我们使用 ListView 时少多了。

如果你觉得默认的表格样式不好看,还可以定制它们。

三、定制表格外观

通过设置 itemDelegate、rowDelegate、headerDelegate 等属性,可以定制表格的外观。

3.1 itemDelegate

itemDelegate 属性指定如何绘制每一个单元格,它的类型是 Component。在 itemDelegate 中可以访问的 styleData 属性与 TableViewColumn 的 delegate —样。下面是一个 itemDelegate 定义实例:

// 设置每个单元格的字体样式
itemDelegate: Text {text: styleData.valuecolor: styleData.selected ? "red" : styleData.textColorelide: styleData.elideMode
}

上面的 ItemDelegate 只有一个 Text 对象,它的 text 属性被设置为 styleData.value 。如果本 Item 被选中,文本颜色用红色,否则就用 styleData.textColor 文本如果显示不全,就采用 styleData.elideMode 指定的省略模式(在默认模式下省略号在右侧)。

itemDelegate 并不局限于一个简单的可见 Item,你可以组合多个可见元素来实现复杂的 itemDelegate,比如在单元格内放置一个复选框、一个图片等。

3.2 rowDelegate

rowDelegate 属性指定如何绘制行背景,它的高度将决定 TableView 的行高。 rowDelegate 可以访问下列 styleData 属性(你可以理解成每一行都有这些属性可用):

styleData.altemate,本行使用交替的背景颜色时为true。
styleData.selected,本行被选中时为 true。
styleData.row,本行的索引。

下面是一个 rowDelegate 实例:

// 设置行的背景色
rowDelegate: Rectangle {color: styleData.selected ? root.highlight : root.alterBackground
}

在上面的 rowDelegate 中,我用一个 Rectangle 作为行背景元素,根据是否使用交替背景、是否选中为行指定了不同的背景色。

3.3 headerDelegate

headerDelegate 属性定义如何绘制表头,它可以访问下列 styleData 附加属性:

styleData.value,本 Item 的值。
styleData.column,本列索引。
styleData.pressed,本列被按下(如鼠标左键按下或手指按下)时为 true。
styleData.containsMouse,鼠标是否停在本列内。
styleData.textAlignment,本列文本的水平对齐方式。

下面是一个 headerDelegate 实例:

// 渐变色
property var normalG: Gradient {GradientStop { position: 0.0; color: "#c7d3ac" }GradientStop { position: 1.0; color: "#F0F0F0" }
}
property var hoverG: Gradient {GradientStop { position: 0.0; color: "white"; }GradientStop { position: 1.0; color: "#d7e3bc"; }
}
property var pressG: Gradient {GradientStop { position: 0.0; color: "#d7e3bc"; }GradientStop { position: 1.0; color: "white"; }
}
// ...
// 设置表头的样式
headerDelegate: Rectangle {implicitWidth: 10implicitHeight: 24gradient: styleData.pressed ? root.pressG : (styleData.containsMouse ? root.hoverG: root.normalG)border.width: 1border.color: "gray"Text {anchors.verticalCenter: parent.verticalCenteranchors.left: parent.leftanchors.leftMargin: 4anchors.right: parent.rightanchors.rightMargin: 4text: styleData.valuecolor: styleData.pressed ? "red" : "blue"font.bold: true}
}

我通过 headerDelegate 改变了默认的表头外观,使用渐变色来填充表头背景,为鼠标按下、经过定义了不同的背景颜色和文本颜色。

3.4 定制表格外观后的示例

现在让我们修改一下 phone_table_simple.qml 示例,为 TableView 添加 itemDelegate、 rowDelegate、headerDelegate,改变 TableView 的外观。新的 QML 文件是 phone_table_delegate.qml,内容如下:

import QtQuick 2.2
import QtQuick.Controls 1.2Rectangle {width: 360height: 300id: rootproperty var background: "#d7e3bc"property var alterBackground: "white"property var highlight: "#e4f7d6"property var headerBkgnd: "#F0F0F0"property var normalG: Gradient {GradientStop { position: 0.0; color: "#c7d3ac" }GradientStop { position: 1.0; color: "#F0F0F0" }}property var hoverG: Gradient {GradientStop { position: 0.0; color: "white"; }GradientStop { position: 1.0; color: "#d7e3bc"; }}property var pressG: Gradient {GradientStop { position: 0.0; color: "#d7e3bc"; }GradientStop { position: 1.0; color: "white"; }}TableView {id: phoneTablefocus: trueanchors.fill: parentTableViewColumn{ role: "name"  ; title: "Name" ; width: 100; elideMode: Text.ElideRight;}TableViewColumn{ role: "cost" ; title: "Cost" ; width: 100; }TableViewColumn{ role: "manufacture" ; title: "manufacture" ; width: 140; }// 设置每个单元格的字体样式itemDelegate: Text {text: styleData.valuecolor: styleData.selected ? "red" : styleData.textColorelide: styleData.elideMode}// 设置行的背景色rowDelegate: Rectangle {color: styleData.selected ? root.highlight : root.alterBackground}// 设置表头的样式headerDelegate: Rectangle {implicitWidth: 10implicitHeight: 24gradient: styleData.pressed ? root.pressG : (styleData.containsMouse ? root.hoverG: root.normalG)border.width: 1border.color: "gray"Text {anchors.verticalCenter: parent.verticalCenteranchors.left: parent.leftanchors.leftMargin: 4anchors.right: parent.rightanchors.rightMargin: 4text: styleData.valuecolor: styleData.pressed ? "red" : "blue"font.bold: true}}model: ListModel {id: phoneModelListElement{name: "rongyao2";cost: "4900";manufacture: "huawei"}ListElement{name: "s6";cost: "4800";manufacture :"sumsung"}ListElement{name: "apple5"cost: "3300"manufacture: "apple"}ListElement{name: "Mi5"cost: "3200"manufacture: "xiaomi"}}}
}

效果图如下:
在这里插入图片描述

四、动态增删改查 TabelView

有时你可能会想给 TableView 添加一列(一个字段),这时可以使用addColumn()方法, 其参数是 TableViewColumn,指向一个 TableViewColumn 实例,你可以动态创建这个实例。

对于前两节的示例,第三列可以这样添加进去:

Component.onCompleted: {var col = Qt.createQmlObject("import QtQuick 2.2\nimport QtQuick.Controls 		 1.2\nTableViewColumn{ role: \"mamifacturer\"; title: \"Manufacturer\"; width: 140; }", phoneModel);phoneTable.addColumn( col );
}

要想在指定位置添加一列,可以使用insertColumn(index, column)方法,index 参数指定列的索引,column 参数与 addColumn() 的参数一样。

如果你想删除某列,可以使用removeColumn(index)方法,指定列索引即可。

TableView 还提供了moveColumn(from, to),用于将一列从位置 from 移动到 to。

而如果你想给 TableView 动态添加数据,则可以通过调用 ListModel 的 append() 或 insert() 方法实现。删除数据通过 ListModel 的 clear() 或 remove() 方法实现。这些在前面介绍 ListView 的时候都已经介绍过了。

对于自定义的 Model,比如在 C++ 中实现的,则需要提供增、删、改数据的接口。 TableView 就介绍到这里了,进一步的应用请结合示例和 Qt 帮助学习。


http://chatgpt.dhexx.cn/article/E3lOFYZh.shtml

相关文章

QT控件之(TableView)的居中效果

T将tableView中的表头以及文本内容都进行居中处理 1、需要在构造函数中增加一句: //以下增加的是表头的效果 ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//布局排版是全部伸展开的效果2、就是直接对tableView的文本内…

QML学习十七:TableView的简单使用

若该文为原创文章,转载请注明原文出处 一、TableView TableView是Qt Quick为表格式呈现数据提供的组件。 TableView与ListView类似,相比之下多了滚动条、挑选、可调整尺寸的表头等特性,数据也是通过Model来提供,此篇使用的是内建…

JavaFX中TableView的使用

稍微说说JavaFX里面TableView怎么用,(其实在JavaFX的源码中都有示例。。。) 首先要了解TableView是用来做什么的,TableView是JavaFX的一个表视图,用来显示表格的,在TableView的类注释中写了 /*** see Tab…

Qt4实现TableView显示表格数据

最近又开始搞QT开发了,前面学的MVC啥的都忘得差不多了,重新整理一遍思路吧。 目前的需求是:读取文本文件,表格型数据,用tableview显示出来,最后画图。这涉及到三个问题,文件读写,数…

NAT模式下的虚拟机网络配置

原理 NAT模式,也叫地址转换模式, 当把我们的虚拟机的上网方式设置为NAT模式时,虚拟机、宿主机、各网卡之间的连接关系可用下图来表示: 具体配置流程 1 将本地以太网共享到v8适配器上 2 查看虚拟网络编辑中的NAT模式下的子网IP…

虚拟机vmware设置nat模式上网

桥接模式上网:虚拟机vmware设置桥接模式上网_cao849861802的博客-CSDN博客 首先虚拟机有两个虚拟网卡vmnet0和vmnet8 这个vmnet0默认的是桥接模式,这个vmnet8默认是nat模式; 我们这里只看nat模式,所以先不关心vmnet0虚拟网卡&a…

VMware16NAT模式配置固定IP

文章目录 前言一、NAT配置固定IP二、重启网卡结尾 前言 为什么要配置固定IP呀?这个很容易解释啊,因为配置集群要设置固定IP(主结点需要管理子结点,通过固定IP识别机器),因为你访问虚拟机方便(不…

VMware Workstation中桥接模式、NAT模式、仅主机模式

一、VMware虚拟机的网络模式 VMware工作站虚拟机有三种网络模式【①桥接模式 ②NAT模式 ③仅主机模式】,如下图所示: 二、VMware虚拟机的网络模式介绍 2.0、VMware的虚拟设备 VMware的虚拟设备 序号虚拟设备编号说明1VMnet0是虚拟桥接网络下的虚拟交换机2VMnet1是虚拟Host-…

vm虚拟机nat模式配置

痛点: 为了解决虚拟机与板子网络的调试的问题,我之前一直用桥接,如果虚拟机想上网就桥接到无线网卡,如果想连接板子,就桥接到有线网卡,麻烦,需要来回切换,还有就是不插板子的情况下和…

nat模式

原文链接:https://www.linuxidc.com/Linux/2016-09/135521p2.htm (复制过来只是为了学习方便,如有不妥会立即删除) 二、NAT(地址转换模式) 刚刚我们说到,如果你的网络ip资源紧缺,但…

虚拟机NAT模式无法联网

工作中遇到NAT模式虚拟机,修改了编辑-虚拟网络编辑器 中NAT设置IP,DNS,DHCP等配置,在centos8中修改了ens33文件都无法联网的情况,特此总结解决方案 按照该方法尝试后无效(解决方法在下面) 第一…

桥接模式NAT模式 详解

NAT模式 和 桥接模式 网络地址转换 NAT : 首先看一下NAT的概念:装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址,这样所有使用本地地址(内部专用地址)的主机在和外界通信时&#xff…

虚拟机NAT模式无法上网

虚拟机NAT模式无法上网 一、确认虚拟机的ip地址二、确认服务是否开启 一、确认虚拟机的ip地址 确认虚拟机的ip地址与本机的vmnet8的ip地址是否在同一个网段,且网关是否一致: cd /etc/sysconfig/network-scripts/ ls vi ifcfg-ens33如果ip配置都没有问…

【VMware】NAT模式、桥接模式、仅主机模式

VMware的NAT模式、桥接模式、仅主机模式 转载自:https://wxler.github.io/2021/02/02/221724/ 1. NAT模式 拓扑图: 在NAT网络中,会用到VMware Network AdepterVMnet8虚拟网卡。 VMware Network AdepterVMnet8是主机上的一块虚拟网卡&…

虚拟机NAT模式集群改为桥接模式集群

有时候,A 电脑要访问 B 电脑上安装的虚拟机,尴尬的是之前虚拟机配置的网络连接模式为 NAT 模式。 那怎么才能让 A 电脑正常地访问 B 电脑上的虚拟机呢?就需要将虚拟机的网络连接模式由 NAT 模式修改为 桥接模式 。 需要下面简单的几步就可以…

LVS NAT模式配置实践

1. LVS单网卡配置 注:实际应用中LVS使用双网卡,这里仅做演示用。架构图如下: 单网卡LVS 1.1 机器信息 LVS LVS:eth0 10.10.1.100(VIP) Real Server RS1:eth0 10.10.1.1RS2:eth…

虚拟机网络模式-NAT模式配置

1、打开VMware,点击编辑——》虚拟网络编辑器 2、配置NAT子网。 注意:不能配置和物理主机为同一网段的IP段 点击NAT设置。设置虚拟子网的网关 注意:正常是使用.1做为网关,如果出现网络不行,可以改成.2做网关 4、点击…

Linux下配置nat模式

(一)打开网络虚拟编辑器 点击更改设置,我们安装好VMware后,在网络连接处会出现两张虚拟网卡,分别是vmnet1和vmnet8,net模式需要配置vmnet8网卡。 接下来通过命令进入 cd /etc/sysconfig/network-scripts&am…

Vmware配置NAT模式

NAT模式注意事项 1.虚拟网卡要和虚拟机在一个网段内。 2.虚拟网卡的网关要和虚拟机网关相同。 3.虚拟机网卡的子网和物理主机不需要在同一个网段,物理主机网段一般为192.168.1.xx,建议虚拟机使用别的网段。 NAT模式使用的是VMnet8虚拟网卡配置 虚拟网络编辑器配置…

【虚拟机NAT模式及桥接模式配置】

VMware虚拟机网络配置 虚拟机常见的网络类型NAT(网络地址转换)Bridged(桥接模式)Host-Only(仅主机) 虚拟机网络配置配置为NAT模式配置为桥接模式 虚拟机常见的网络类型 Vmware 为我们提供了三种网络工作模…