QML类型:TableView

article/2025/8/26 11:33:39

一、描述

TableView 显示从内置 QML 类型(如 ListModel 和 XmlListModel)创建的模型中的数据,这些模型仅填充 TableView 中的第一列。要创建具有多列的模型,请使用 TableModel 或继承 QAbstractItemModel 的 C++ 模型。

TableView 继承了 Flickable。这意味着虽然模型可以有任意数量的行和列,但在视口内通常只能看到表格的一部分。 一旦轻弹,新的行和列就会进入视口,而旧的会退出并从视口中移除。 移出的行和列被重新用于构建移入视口的行和列。因此,TableView 支持任何大小的模型而不影响性能。

二、使用示例

2.1、C++模型

#include <qqml.h>
#include <QAbstractTableModel>class testModel : public QAbstractTableModel
{Q_OBJECTQML_ELEMENTQML_ADDED_IN_MINOR_VERSION(1)public:int rowCount(const QModelIndex & = QModelIndex()) const override{return 10;}int columnCount(const QModelIndex & = QModelIndex()) const override{return 5;}QVariant data(const QModelIndex &index, int role) const override{switch (role){case Qt::DisplayRole:return QString("%1, %2").arg(index.column()).arg(index.row());default:break;}return QVariant();}QHash<int, QByteArray> roleNames() const override{return { {Qt::DisplayRole, "display"} };}
};
    qmlRegisterType<testModel>("com.mycompany.qmlcomponents", 1, 0, "TestModel");
import QtQuick 2.12
import QtQuick.Window 2.12
import Qt.labs.qmlmodels 1.0
import QtQuick.Controls 2.5
import com.mycompany.qmlcomponents 1.0Window
{width: 800height: 400visible: trueTableView{anchors.fill: parentcolumnSpacing: 1rowSpacing: 1clip: truemodel: TestModel{}delegate: Rectangle{implicitWidth: 100implicitHeight: 50Text{text: display}}}
}

2.2、QML模型

import QtQuick 2.12
import QtQuick.Window 2.12
import Qt.labs.qmlmodels 1.0Window
{width: 400;height: 400visible: trueTableView{anchors.fill: parentcolumnSpacing: 1rowSpacing: 1clip: truemodel: TableModel{TableModelColumn { display: "name" }TableModelColumn { display: "color" }rows:[{"name": "cat","color": "black"},{"name": "dog","color": "brown"},{"name": "bird","color": "white"}]}delegate: Rectangle{implicitWidth: 100implicitHeight: 50border.width: 1Text{text: displayanchors.centerIn: parent}}}
}

三、重复使用项目

默认情况下,TableView 回收委托项,而不是在新行和新列被轻弹到视图时从委托实例化。这种方法提供了巨大的性能提升,具体取决于委托的复杂性。

当一个项目被弹出时,它会移动到重用池(未使用项目的内部缓存区)。这时会发出 pooled() 信号以通知该项目。同样,当项目从池中移回时,会发出 reused() 信号。

当项目被重用时,来自模型的任何项目属性都会更新。包括索引、行和列,还包括任何模型角色。

注意:应避免在委托中存储项目的任何状态。如果这样做,应在收到 reused() 信号时重置它。

如果项目有计时器或动画,应考虑在收到 pooled() 信号时暂停它们。这样就可以避免将 CPU 资源用于不可见的项目。同样,如果项目具有无法重用的资源,则可以将其释放。

如果不想重用项目或者如果委托不支持它,可以将重用项目 reuseItems 属性设置为 false。

注意:当一个项目在池中时,它可能仍然处于活动状态并响应连接的信号和绑定。

以下示例显示了一个为旋转矩形设置动画的委托。进入重用池时,动画暂时暂停:

Component 
{id: tableViewDelegateRectangle {implicitWidth: 100implicitHeight: 50TableView.onPooled: rotationAnimation.pause()TableView.onReused: rotationAnimation.resume()Rectangle {id: rectanchors.centerIn: parentwidth: 40height: 5color: "green"RotationAnimation {id: rotationAnimationtarget: rectduration: (Math.random() * 2000) + 200from: 0to: 359running: trueloops: Animation.Infinite}}}
}

四、行高和列宽

当一个新列被轻弹到视图中时,TableView 将通过调用 columnWidthProvider() 函数来确定它的宽度。TableView 不存储行高或列宽,因为它旨在支持包含任意数量行和列的大型模型。

TableView 使用项中最大的隐式宽度(委托的 implicitWidth作为列宽,除非明确设置了 columnWidthProvider()。找到列宽后,同一列中的所有其他项目都将调整为该宽度,即使稍后轻弹的新项目具有更大的隐式宽度。在项目上设置显式宽度将被忽略并覆盖。

注意:列的计算宽度在从视口中弹出时会被丢弃,如果该列被弹回,则重新计算。计算始终基于该列弹入时可见的项目。这意味着该列的宽度每次都可能不同,具体取决于该列进入时所在的行。因此,应该对列中的所有项目具有相同的隐式宽度,或设置 columnWidthProvider() 。相同的逻辑适用于行高计算。

如果更改 rowHeightProvider() 或 columnWidthProvider() 为视口内的行和列返回的值,则必须调用 forceLayout()。这会通知 TableView 它需要再次使用提供程序函数来重新计算和更新布局。

如果要隐藏特定列,可以从该列的 columnWidthProvider() 返回 0。同样,可以从 rowHeightProvider() 返回 0 以隐藏行。如果返回负数,TableView 将回退以根据委托项计算大小。

        columnWidthProvider:function(column){return 0}

注意:行或列的大小应为整数,以避免项目的亚像素对齐。

五、叠加层和底层

从委托实例化的所有新项目都作为 z 值为 1 的 contentItem 的父项。可以在 Tableview 中自行添加项目作为 Flickable 的子项目。通过控制它们的 z 值,可以使它们位于表格项目的顶部或底部。

在表格顶部添加一些文本,当轻弹时,这些文本会与表格一起移动:

import QtQuick 2.12
import QtQuick.Window 2.12
import Qt.labs.qmlmodels 1.0Window
{width: 400;height: 400visible: trueTableView{anchors.fill: parentcolumnSpacing: 1rowSpacing: 1clip: truetopMargin: header.implicitHeightText{z:2id: headertext: "A table header"}model: TableModel{TableModelColumn { display: "name" }TableModelColumn { display: "color" }rows:[{"name": "cat","color": "black"},{"name": "dog","color": "brown"},{"name": "bird","color": "white"}]}delegate: Rectangle{implicitWidth: 100implicitHeight: 50border.width: 1Text{text: displayanchors.centerIn: parent}}}
}

 

六、属性成员

1、bottomRow : int

      leftColumn : int

      rightColumn : int

      topRow : int

当前在视图中可见的最底部的行、最左边的列、最右边的列、最顶部的行。

2、columnSpacing : real

      rowSpacing : real

列间距、行间距。默认值为 0。

3、columnWidthProvider : var

此属性可以包含一个函数,该函数返回模型中每列的列宽。只要 TableView 需要知道特定列的宽度,就会调用它。该函数有一个参数 column 表示列数。

如果要隐藏特定列,可以为该列返回 0 宽度。如果返回负数,TableView 将根据委托项计算宽度。

      rowHeightProvider : var

类似,提供行高。

4、columns : int

      rows : int

只读属性,保存表中的列数、行数。

5、contentHeight : real

      contentWidth : real

此属性包含容纳数据模型中行数所需的表高度 / 宽度(不是 TableView 的高度 / 宽度)。如果知道表格的高度 / 宽度是多少,应为这些属性赋值,以避免对 TableView 进行不必要的计算和更新。

6、delegate : Component

委托提供了一个模板,定义了视图实例化的每个单元格项。 模型索引作为可访问的索引属性公开。 这同样适用于行和列。 根据数据模型的类型,模型的属性也可用。

委托应使用 Item::implicitHeight Item::implicitWidth 指定其大小。TableView 根据该信息布置项目。显式的宽度或高度设置将被忽略和覆盖。

注意:委托根据需要进行实例化,并且可以随时销毁。如果 reuseItems 属性设置为true,它们也会被重用。 因此,应该避免在委托中存储状态信息。

7、selectionModel : ItemSelectionModel

可以设置此属性来控制应将哪些委托项显示为选定项。

8、syncDirection : Qt::Orientations

该属性和 syncView 可以用来让两个tableView在轻弹时平滑同步。

如果设置了 syncView,则此属性控制两个表的轻弹方向的同步。默认为 Qt.Horizontal | Qt.Vertical,即如果向任一方向轻弹任一表,则另一个表也会向同一方向轻弹相同的量。

9、syncView : TableView

如果将一个 TableView 的这个属性设置为另一个 TableView,那么两个表格将根据 syncDirection 在轻弹、列宽/行高和间距方面进行同步。

  • 如果 syncDirection 包含 Qt.Horizontal,则当前 tableView 的列宽、列间距和水平滑动移动与syncView 的同步。
  • 如果 syncDirection 包含 Qt.Vertical,则当前 tableView 的行高、行间距和垂直滑动移动与syncView 的同步。

10、reuseItems 

此属性保存是否应重用从委托实例化的项目。

七、附加属性成员

1、TableView.view : TableView

此附加属性包含管理委托实例的视图。 它附加到委托的每个实例。

八、附加信号成员

1、pooled()

在将项目添加到重用池后发出此信号。可以使用它来暂停项目内正在进行的计时器或动画,或释放无法重复使用的资源。仅当 reuseItems 属性为 true 时才会发出此信号。

2、reused()

该信号在项目被重用后发出。此时,item已经从重用池中取出,放到 content view 里面,index、row、column等模型属性也都更新了。仅当 reuseItems 属性为 true 时才会发出此信号。

九、成员函数

1、Point cellAtPos(point position, bool includeSpacing)

      Point cellAtPos(real x, real y, bool includeSpacing)

返回视图中给定位置的单元格。如果没有单元格与 position 相交,则返回值为 point(-1, -1)。

如果 includeSpacing 设置为 true,则单元格的边界框将被视为包括每一侧相邻 rowSpacing columnSpacing 的一半。 默认值为false。

2、real columnWidth(int column)

返回给定列的宽度。 如果该列未加载(因此不可见),则返回值将为 -1。

应用程序负责通过使用 columnWidthProvider 来存储列宽。如果 TableView 没有设置 columnWidthProvider,则此函数最有用,否则可以调用 columnWidthProvider 设置的函数(即使对于当前不可见的列,它也可以工作。如果没有设置 columnWidthProvider,行高将等于它的implicitColumnWidth()。

      real rowHeight(int row)

类似,返回行高。

3、real implicitColumnWidth(int column)

返回给定列的隐式宽度。如果该列未加载(因此不可见),则返回值将为 -1。

列的隐式宽度是在该列内当前加载的委托项中找到的最大的隐式宽度。不会考虑 columnWidthProvider 返回的宽度。

      real implicitRowHeight(int row)

与上面类似。

4、bool isColumnLoaded(int column)

      bool isRowLoaded(int row)

是否加载了给定的列 / 行。

5、Item itemAtCell(point cell)

      Item itemAtCell(int column, int row)

如果加载,则返回单元格中的委托项,否则返回 null。

注意:通常只加载视图中可见的项目。一旦单元格从视图中弹出,里面的项目将被卸载或放置在回收池中。因此,永远不应存储返回值。

6、positionViewAtCell(point cell, Qt.Alignment alignment, point offset)

定位 Flickable::contentX Flickable::contentY 使参数1的单元格位于对齐指定的位置。

偏移量 offset 以将 contentX contentY 移动超出目标对齐方式的额外像素数。

想定位视图,使单元格 [10, 10] 以 5px 的边距位于左上角:

positionViewAtCell(Qt.point(10, 10), Qt.AlignLeft | Qt.AlignTop, Qt.point(-5, -5))
import QtQuick 2.12
import QtQuick.Window 2.12
import Qt.labs.qmlmodels 1.0Window
{width: 400;height: 400visible: trueTableView{id:viewanchors.fill: parentcolumnSpacing: 1rowSpacing: 1clip: truemodel: TableModel{TableModelColumn { display: "name" }TableModelColumn { display: "color" }rows:[{"name": "cat","color": "black"},{"name": "dog","color": "brown"},{"name": "bird","color": "white"}]}delegate: Rectangle{implicitWidth: 100implicitHeight: 50border.width: 1Text{text: displayanchors.centerIn: parent}}}MouseArea{anchors.fill: parentonPressed:{view.positionViewAtCell(Qt.point(1, 1), Qt.AlignLeft | Qt.AlignTop, Qt.point(-5, -25))}}
}


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

相关文章

QML TableView表格使用示例

前言 QML中实现表格可以使用多种方式&#xff0c;比如直接使用ListView&#xff0c;定义每一行delegate&#xff0c;或者自定义Rectangle&#xff0c;放到Flipable中组合使用。Qt Quick Control1中 从5.1版本开始就提供了表格控件&#xff0c;但是感觉不怎么好用&#xff0c;在…

Qt TableView的简单使用

软件环境&#xff1a; ubuntu -------------------------------------------------------------------------------------------------------- 最终效果图&#xff1a; --------------------------------------------------------------------------------------------------…

PyQt5 TableView组件

一、话不多说&#xff0c;先看图 本次要实现的是主窗口内添加widget组件&#xff0c;widget内设置成垂直盒布局&#xff0c;然后在布局中添加tableView、PushButton组件 二、看main函数 if __name__ __main__:app QApplication(sys.argv)# 现在这创建 主窗口 &#xff08;不然…

优雅的开发TableView

前言 UITableView&#xff08;UITableViewController&#xff09;是iOS开发使用频率最高的一个组件。 不管是使用UITableView还是还是UITableViewController&#xff0c;在开发的时候&#xff0c;我们都需要实现两个协议&#xff1a; UITableViewControllerDataSourceUITabl…

JavaFX控件——TableView

在JavaFX 应用中对创建表格最重要的是TableView, TableColumn和TableCell这三个类。 你可以通过实现数据模型&#xff08;data model&#xff09; 和 实现 单元格工厂(cell factory) 来填充表格。 表格类提供了表格列嵌入式的排序能力和必要时调整列宽度的功能。 下面开始学…

ios开发:多个Section的TableView

开发多个Section的tableView。 首先应该考虑到数据源该如何得到 我们这里可以通过两种方式:第一种是读取plist文件。第二种是通过代码进行数据存储以及读取。 多个Section需要的数据源是一个字典&#xff0c;字典里的内容是一个数组。在plist文件中可以这样去创建 在.h文件中…

tableview概述

转自&#xff1a;http://www.cnblogs.com/smileEvday/archive/2012/06/28/tableView.html                 下面分9个方面进行介绍&#xff1a; 一、UITableView概述 UITableView继承自UIScrollView&#xff0c;可以表现为Plain和Grouped两种风格&#xff0c;分…

ios tableView那些事(一)创建一个简单的tableView

工作也有半年多了&#xff01;几乎每个项目中的会用到tableview这个神奇而好用的控件&#xff0c;在学习和工作中都会看别人的博客&#xff01;对我有很大的帮助&#xff0c;就如同站在巨人的肩膀上的感觉吧 哈哈&#xff01;于是决定重新开始写博客&#xff0c;希望能帮助像我…

JavaFX TableView和ListView的点击事件

项目场景&#xff1a; 最近在用JavaFX做一个简易的商城界面&#xff0c;大概想实现这样的功能&#xff1a; 左边显示用户的最近五个购买的产品 使用ListView 点击ListView的项目会定位到相应的tablerow位置 方便用户快速查找中间显示所有可用产品 使用TableView 双击tablerow…

JavaFX【TableView使用详解】

目录 概述 组件 Student ObservableList TableView setCellValueFactory() TableColumn 1. Callback 2. PropertyValueFactory 增加到末行 1、tableView.getItems().add(Student s) 2、list.add(Student s) 删除指定行 1、tableView.getItems().remove(int i) 2、…

QT中TableView数据展示

QT中TableView数据展示 最近在学习QT,大量数据从数据库取出放入QT界面中展示&#xff0c;这时用到了tableView&#xff0c;一些简单的使用分享给大家。 创建数据模型 QStandardItemModel *modelnew QStandardItemModel(); QStandardItemModel是Qt库中的一个类&#xff0c;它…

JAVAFX的TableView基本用法

JAVAFX中的表格显示主要使用TableView 与TableView相关的类: TableColumn TableRow TableCell TablePosition TableViewFocusModel TableViewSelectionModel JavaFX TableView例子: import javafx.application.Application; import javafx.scene.Scene; import javafx.scene…

QT之Tableview

想要了解更多的tableview可以看这位博客Qt深入浅出&#xff08;十五&#xff09;QTableView​ 这里做了一个简单的学生系统查询功能显示Tableview&#xff1a; 表格视图控件QTableView&#xff0c;需要和QStandardItemModel, 配套使用&#xff0c;这套框架是基于MVC设计模式设…

QML TableView 使用详解

目录 一、—个简单的TableView实例 二、TableViewColumn 属性讲解 三、定制表格外观 3.1 itemDelegate3.2 rowDelegate3.3 headerDelegate3.4 定制表格外观后的示例 四、动态增删改查 TabelView TableView 就是 Qt Quick 为表格式呈现数据提供的组件。想必兄台用过 Excel…

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

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

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

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

JavaFX中TableView的使用

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

Qt4实现TableView显示表格数据

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

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

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

虚拟机vmware设置nat模式上网

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