QT Quick QML 实例之定制 TableView

QT Quick QML 实例之定制 TableView

  • 一、演示
  • 二、C++关键步骤
    • 1. beginInsertRows()(用户插入行)
    • 2. roleNames() (表格中列映射)
    • 3. data() (用户获取数据)
    • 4. headerData() (表头)
    • 5. flags (某个单元格的特性标志)
    • 6. setData (用户更新数据)
  • 三、QML UI 显示


所有的热爱都要不遗余力,真正喜欢它便给它更高的优先级,和更多的时间吧!

GIT工程源码在这里:     QmlLearningPro编译选择 TableView

QML其它文章请点击这里:     QT QUICK QML 学习笔记


一、演示

● 效果如下:
请添加图片描述

二、C++关键步骤

在Qt中,如使用 QML 的 TableView 并且想要将数据与C++类进行绑定,通常会继承 QAbstractTableModel 来实现自定义的数据模型

1. beginInsertRows()(用户插入行)

beginInsertRows 是 Qt 中的 QAbstractItemModel 类的一部分,用于通知视图 (view) 即将向模型 (model) 中插入行。这个方法通常与 endInsertRows 配对使用,以确保模型的内部数据和视图保持一致。

void MyModel::insertRows(int position, int rows, const QModelIndex &parent = QModelIndex()) {// 通知视图即将插入行beginInsertRows(parent, position, position + rows - 1);// 执行实际的数据插入操作// 例如:for (int row = 0; row < rows; ++row) {dataList.insert(position, newRowData);}// 通知视图插入行操作已经完成endInsertRows();
}

2. roleNames() (表格中列映射)

roleNames() 是 QAbstractItemModel 类中的一个虚函数,通常用于返回模型中的角色(roles)与角色名称(role names)之间的映射。角色在 Qt 的模型-视图框架中用于区分不同类型的数据(例如显示数据、编辑数据、工具提示等)。

//为每个角色提供一个名称,主要用于 QML 绑定。
QHash<int, QByteArray> TargetCoordinate::roleNames() const
{QHash<int, QByteArray> roles;roles.insert(lngRole,  "lng");roles.insert(latRole,  "lat");roles.insert(altRole,  "alt");return roles;
}

QML 中使用:

	TableViewColumn {role: "lng"   //来源于C++中roleNamestitle: "Longitude"resizable: true}TableViewColumn {role: "lat"   title: "Latitude"resizable: true}TableViewColumn {role: "alt"  title: "Altitude"resizable: true}

3. data() (用户获取数据)

在 Qt 的 QAbstractItemModel 类中,data() 函数用于返回模型中某个特定项的数据信息。这个函数通常和 roleNames() 函数结合使用,以便为不同的角色返回相应的数据。

视图(如ListView)中请求模型的数据时,视图会调用 data() 函数,并传递相应的 QModelIndex 和 role, data() 函数会根据这些参数返回对应的数据。

QVariant TargetCoordinate::data(const QModelIndex &index, int role) const
{if (!index.isValid())return QVariant();if (index.row() < 0 || index.row() >= m_coordinates.count())return QVariant();const QGeoCoordinate &coordinate = m_coordinates.at(index.row());switch(role){case lngRole:return QString::number(coordinate.longitude(), 'f', 6);case latRole:return QString::number(coordinate.latitude(), 'f', 6);case altRole:return QString::number(coordinate.altitude(), 'f', 2);}return QVariant();
}

data() 和 roleNames()关系:

data():提供模型项在特定角色下的数据。
roleNames():为每个角色提供一个名称,主要用于 QML 绑定。

4. headerData() (表头)

headerData() 是 QAbstractItemModel 类中的另一个重要虚函数,用于提供模型的表头信息。在 Qt 的模型-视图框架中,表头用于显示列标题或行标题,通常用于 QTableView、QTreeView 或类似的视图中。

QVariant TargetCoordinate::headerData(int section, Qt::Orientation orientation, int role) const
{if (role != Qt::DisplayRole)return QVariant();/* 当请求的方向为 Qt::Horizontal 时,我们返回与请求的 section(列索引)相关的表头数据。*/if (orientation == Qt::Horizontal) {if (section == 0)return tr("lng");else if (section == 1)return tr("lat");else if (section == 2)return tr("alt");}return QVariant();
}

headerData() 通常与 data() 一起使用,前者用于表头的显示,后者用于表格中具体单元格的显示。

5. flags (某个单元格的特性标志)

flags 用于返回模型中某个项的特性标志(flags)。这些标志指示该项是否可选中、可编辑、可拖放等行为。通过重写 flags() 函数,可以控制模型中每个项的交互行为。

Qt::ItemFlags TargetCoordinate::flags(const QModelIndex &index) const
{qDebug() << "flags()" ;if (!index.isValid())return Qt::NoItemFlags;return Qt::ItemIsEditable | QAbstractTableModel::flags(index);
}

常见的 Qt::ItemFlag 枚举值:

Qt::NoItemFlags: 表示没有特性,项不可交互。
Qt::ItemIsSelectable: 该项是可选择的。
Qt::ItemIsEditable: 该项是可编辑的。
Qt::ItemIsDragEnabled: 该项支持拖动操作。
Qt::ItemIsDropEnabled: 该项支持放置操作。
Qt::ItemIsUserCheckable: 该项可以显示一个复选框,允许用户进行选择。
Qt::ItemIsEnabled: 该项是可用的(如果未设置,则该项将显示为禁用状态)。

6. setData (用户更新数据)

功能:

编辑数据: 当用户在视图中编辑数据(如在表格单元格中输入文本或选择复选框)时,视图会调用 setData() 函数,模型根据提供的新数据更新相应的项。

拖放操作: 如果支持拖放操作,当数据被放置到模型中的某个位置时,setData() 可能会被调用以插入新数据。

批量数据更新: 你可以在外部批量修改模型的数据,每次修改后调用 setData() 更新特定的项

bool TargetCoordinate::setData(const QModelIndex &index, const QVariant &value, int role)
{if (!index.isValid() || role != Qt::EditRole)return false;if (index.row() < 0 || index.row() >= m_coordinates.count())return false;QGeoCoordinate &coordinate = m_coordinates[index.row()];if (index.column() == 0)coordinate.setLongitude(value.toDouble());else if (index.column() == 1)coordinate.setLatitude(value.toDouble());else if (index.column() == 2)coordinate.setAltitude(value.toDouble());//表示仅有一个单元格的数据发生了更改emit dataChanged(index, index);return true;
}

组合使用
setData() 与 data():setData() 用于更新数据,而 data() 则用于获取数据。视图在显示数据时调用 data(),在用户修改数据时调用 setData()。

flags():在 flags() 函数中设置 Qt::ItemIsEditable 标志,以确保该项可编辑。只有当项是可编辑的,视图才会调用 setData()。

dataChanged 信号:在 setData() 中调用 emit dataChanged(index, index),通知视图相应项的数据已经改变。视图会自动重新绘制受影响的项。

三、QML UI 显示

TableView {id: tableViewanchors.margins:    10anchors.fill:       parentmodel:       coordinateModel//表格属性itemDelegate: {return editableDelegate;}rowDelegate: Rectangle {color : styleData.selected ? "#7db9f7" : (styleData.alternate ? "#f5f1f1":"#a89d9d")height: 30}TableViewColumn {role: "lng"   //来源于C++中roleNamestitle: "Longitude"resizable: true}TableViewColumn {role: "lat"   //ytitle: "Latitude"
//                width: 120resizable: true}TableViewColumn {role: "alt"   //title: "Altitude"resizable: true}headerDelegate: Rectangle {implicitWidth: heardText.widthimplicitHeight: heardText.height * 1.6gradient:       styleData.pressed ? pressG : (styleData.containsMouse ? hoverG: normalG)border.width: 1border.color: "gray"Text {id:     heardTextanchors.centerIn: parentfont.pixelSize: 22text:           styleData.valuecolor:          styleData.pressed ? "red" : "blue"font.bold: true}}Component {id: editableDelegateRectangle {border.color: "gray"border.width: 1Item{anchors.centerIn: parentheight:  showTXT.height * 1.2width:   showTXT.width * 1.2Text {id:showTXTanchors.centerIn: parentelide: styleData.elideModetext: styleData.value !== undefined ? styleData.value : ""color: styleData.selected ? "red" : "black"//styleData.textColorfont.pixelSize:  18horizontalAlignment: Text.AlignHCenter}}}}RowLayout {anchors.horizontalCenter:   rootRect.horizontalCenteranchors.top:                rootRect.bottomanchors.topMargin:          20Button {text:  "add"onClicked:      {coordinateModel.insertRowsCoor(tableView.currentRow+1, 1);tableView.currentRow = tableView.currentRow + 1tableView.refreshTableView}}Button {text:  "delete"onClicked:      {if(tableView.rowCount ===0)  returnif(tableView.currentRow === -1)    coordinateModel.removeRowsCoor(tableView.currentRow-1);else    coordinateModel.removeRowsCoor(tableView.currentRow);tableView.refreshTableView}}}

具体代码见工程源码


GIT 工程文件点击这里:     QmlLearningPro编译选择 TableView

QML 其它文章请点击这里:     QT QUICK QML 学习笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

影视会员官方渠道api对接

API对接是指两个不同的软件系统或应用程序之间通过API&#xff08;应用程序编程接口&#xff09;进行交互的过程。这种交互允许数据和功能的共享&#xff0c;而不必暴露系统的内部工作原理。在影视会员充值场景中&#xff0c;API对接具有以下几个关键特点和优势&#xff1a; 数…

【从Qwen2,Apple Intelligence Foundation,Gemma 2,Llama 3.1看大模型的性能提升之路】

从早期的 GPT 模型到如今复杂的开放式 LLM&#xff0c;大型语言模型 (LLM) 的发展已经取得了长足的进步。最初&#xff0c;LLM 训练过程仅侧重于预训练&#xff0c;但后来扩展到包括预训练和后训练。后训练通常包括监督指令微调和校准&#xff0c;这是由 ChatGPT 推广的。 自 …

11、Redis高级:Key设置、BigKey解决、批处理优化、集群下批处理、慢查询

Redis高级篇之最佳实践 今日内容 Redis键值设计批处理优化服务端优化集群最佳实践 1、Redis键值设计 1.1、优雅的key结构 Redis的Key虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过…

沉浸式解压小视频在哪找?非常减压的几个视频素材网站分享

沉浸式解压小视频&#xff0c;以其独特的舒缓音乐、宁静自然景观和柔和动态图像&#xff0c;成为了迅速消解压力的有效途径。这些视频能够帮助我们暂时离开紧张的现实&#xff0c;重获内心的平和。如果你正在寻找优质的解压视频素材&#xff0c;不用担心&#xff0c;接下来我会…

【HarmonyOS NEXT星河版开发学习】综合测试案例-各平台评论部分

目录 前言 功能展示 整体页面布局 最新和最热 写评论 点赞功能 界面构建 初始数据的准备 列表项部分的渲染 底部区域 index部分 知识点概述 List组件 List组件简介 ListItem组件详解 ListItemGroup组件介绍 ForEach循环渲染 列表分割线设置 列表排列方向设…

图像分割论文阅读:BCU-Net: Bridging ConvNeXt and U-Net for medical image segmentation

本文提出了一种集合ConvNeXt和U-Net优势的网络模型来分割医学图像。 当然&#xff0c;模型整体结构就是并列双分支&#xff0c;如果只是这些内容&#xff0c;不值得拿出来讲。 主要有意思的部分是其融合两分支的多标签召回模块&#xff08;multilabel recall loss module&…

如何使用midjourney?MidJourney订阅计划及国内订阅教程

国内如何订阅MidJourney 第三方代理 参考&#xff1a; zhangfeidezhu.com/?p474 使用信用卡订阅教程 办理国外信用卡&#xff1a; 这个各自找国外的银行办理就好了。 登录MidJourney&#xff1a; 登录MidJourney网站&#xff0c;进入订阅中心。如果是在Discord频道&#x…

ES 模糊查询 wildcard 的替代方案探索

一、Wildcard 概述 Wildcard 是一种支持通配符的模糊检索方式。在 Elasticsearch 中&#xff0c;它使用星号 * 代表零个或多个字符&#xff0c;问号 ? 代表单个字符。 其使用方式多样&#xff0c;例如可以通过 {"wildcard": {"field_name": "value&…

IP in IP 协议

IP in IP 是一种多重IP协议&#xff0c;即&#xff1a;客户机可以发送一个IP协议内部在嵌套一个IP协议到某个特定的主机上&#xff0c;在由具体的主机作为路由进行转发的协议。 例如&#xff1a; IP in IP帧协议结构为&#xff0c;第一层为发送到IP in IP 路由主机的报文&…

Vmware Workstation Pro 17.5.2最新版安装-免费使用

安装要求&#xff1a; Windows 10 或 11 操作系统&#xff08;64位&#xff09; 兼容的多核 64 位&#xff08;x86&#xff09;处理器&#xff08;1.3GHz 或更高&#xff09; 至少 4GB 内存&#xff08;建议越大越好&#xff09; 至少 1.2GB 可用磁盘空间 BIOS/UEFI 中开启…

epoll+线程池模型

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ 负载均衡技术 …

网站上线流程完全手册:域名、服务器与CDN

网站上线的核心要点 需要买域名 域名备案(国内) 买服务器 把服务器IP和域名(网址)绑定 把本地网站代码文件上传到服务器上 我来先来了解下以上的概念 域名介绍 域名是网站的地址&#xff0c;类似于你的家在街上的位置。它让人们通过简单的名字&#xff08;如 www.baidu.…

机器学习周报(8.19-8.25

文章目录 摘要Abstract1.PyTorch环境的配置及安装使用PyCharm配置环境安装配置jupyter 2.两个Python常用函数3.DataSet4.TensorBoard的使用绘制一幅坐标图使用tendorboard对一幅图片进行操作 5.torchvison中的transforms总结 摘要 在之前学习了一些机器学习相关理论之后&#…

【算法进阶2-动态规划】最长公共子序列、欧几里得算法-分数、RSA算法-密码于加密

1 最长公共子序列 2 欧几里得算法 2.1 欧几里得算法-分数 3 RSA算法-密码于加密 1 最长公共子序列 -个序列的子序列是在该序列中删去若干元素后得 到的序列。 例:“ABCD”和“BDF”都是“ABCDEFG”的子序列最长公共子序列(LCS)问题:给定两个序列X和Y&#xff0c;求X和Y长度最大…

Hadoop的概念

目录 1.什么是大数据 2.Hadoop体系结构 1&#xff1a;HDFS&#xff08;Hadoop Distributed File System&#xff09; 2 &#xff1a;MapReduce 3&#xff1a;YARN&#xff08;Yet Another Resource Negotiator&#xff09; 3、Hadoop生态圈 4、MapReduce的原理和工作流程…

android gradle 配置国内gradle地址

1. 地址&#xff1a; 腾讯云镜像 Gradle下载地址&#xff1a;https://mirrors.cloud.tencent.com/gradle/ 阿里云镜像 Gradle下载地址&#xff1a;https://mirrors.aliyun.com/macports/distfiles/gradle/ 阿里云镜像 Gradle下载地址&#xff1a;https://mirrors.aliyun.com…

浪潮服务器主板集成RAID常见问题

★主板集成RAID出现Initialize初始化&#xff0c;如下图 判断及解决方案&#xff1a; 1.机器是否有过插拔硬盘等操作。 2.系统初始化-系统启动会非常的慢。一般为非法关机或者断电导致。 3.出现此情况耐心等待磁盘初始化完成即可。系统初始化时间以具体的数据大小来决定&#…

Linux启动流程和Systemd特性

文章目录 内核设计流派linux启动流程1.硬件加电自检2.启动加载器bootloader3.加载kernel4.init初始化5.用户终端启动 systemdsystemd特性systemd的unitunit配置文件 systemctl管理系统服务service unit服务状态 service unit文件格式Unit段Service段Install段 内核设计流派 1.…

android 实现简易音乐播放器

音乐App 源代码 &#xff1a; 简易音乐APP源代码 1、简介 一个简易的音乐APP&#xff0c;主要练习对四大组件的应用。感兴趣的可以看看。 播放界面如下&#xff1a; 歌曲列表界面如下&#xff1a; 项目结构如下&#xff1a; 接下来将对代码做详细介绍&#xff1a; 2、Musi…

【SpringCloud Alibaba】(九)学习 Gateway 服务网关

目录 1、网关概述1.1、没有网关的弊端1.2、引入 API 网关 2、主流的 API 网关2.1、NginxLua2.2、Kong 网关2.3、Zuul 网关2.4、Apache Shenyu 网关2.5、SpringCloud Gateway 网关 3、SpringCloud Gateway 网关3.1、Gateway 概述3.2、Gateway 核心架构 4、项目整合 SpringCloud …