QStandardItemModel 类作为标准模型,主打“类型通用”,前一篇水文中,老周还没提到树形结构的列表,本篇咱们就好好探讨一下这货。

还是老办法,咱们先做示例,然后再聊知识点。下面这个例子,使用 QTreeView 组件来显示数据,使用的列表模型比较简单,只有一列。

#include <QApplication>
#include <QTreeView>
#include <QStandardItem>
#include <QStandardItemModel> int main(int argc, char* argv[])
{
QApplication app(argc, argv); // 创建组件实例
QTreeView *viewWind = new QTreeView(nullptr);
// 创建数据模型
QStandardItemModel* model;
model = new QStandardItemModel(viewWind);
// 顶级节点
QStandardItem* top1 = new QStandardItem("工程部");
// 添加子节点
top1->setChild(0/*行号*/, new QStandardItem("螺母组"));
top1->setChild(1, new QStandardItem("电钻组")); // 继续添加顶层节点
QStandardItem *top2 = new QStandardItem("情报部");
// 添加子节点
top2->setChild(0, new QStandardItem("偷窥组"));
top2->setChild(1, new QStandardItem("监听组")); // 把两个顶层节点添加到模型中
model->setItem(0/*行号*/, top1);
model->setItem(1, top2);
// 将模型应用到视图
viewWind->setModel(model);
// 显示视图窗口
viewWind->show(); return QApplication::exec();
}

最先添加到 QStandarItemModel 的 QStandardItem 被视为树的顶层节点。调用顶层节点的 setChild 方法会添加子节点。从数据模型的角度看,子节点可以是一个二维表,即可以指定行号和列号的。不过,上面这个示例咱们只用了一列,即列号一直是0,所以调用的重载方法只需指定行号即可。其签名如下:

void setChild(int arow, QStandardItem *aitem)

arow 参数指定的是行的索引,要将子项放在第一行就传 0,放在第二行就传1,等等。此重载版本忽略了列号。

QStandardItem 对象之间建立好层次关系后,最终还要添加到 QStandardItemModel 中的,不然前面的工夫就白做了——数据当然要放进模型中的嘛。

当模型准备好后,调用视图组件的 setModel 方法呈现模型数据。

viewWind->setModel(model);

最终效果可以看下图:

你可能会疑惑:左上角那个“1”是什么鬼?那个鬼是列号,咱们这例子只有一列,所以显示了默认列号。一般单列数据不需要列标题,可以将其隐藏。

viewWind->setHeaderHidden(true);

true 表示隐藏行、列标题,false 表示显示标题。

这样看起来就顺眼多了。

Qt 的 TreeView 有一点很不错,就是可以显示多列。比如,下面这个例子,列表项包含三列。

#include <QApplication>
#include <QStandardItem>
#include <QStandardItemModel>
#include <QTreeView> int main(int argc, char* argv[])
{
QApplication app(argc, argv); // 视图
QTreeView* view = new QTreeView;
// 模型
QStandardItemModel *model = new QStandardItemModel; // 顶层节点1
QStandardItem* root1 = new QStandardItem("普通班");
// 添加子节点
// 第一行
QStandardItem* sub11 = new QStandardItem("230566");
QStandardItem* sub12 = new QStandardItem("小齐");
QStandardItem* sub13 = new QStandardItem("老齐");
root1->setChild(0, 0, sub11);
root1->setChild(0, 1, sub12);
root1->setChild(0,2, sub13);
// 第二行,可以直接插入QStandardItem实例
root1->setChild(1, 0, new QStandardItem("230524"));
root1->setChild(1, 1, new QStandardItem("小王"));
root1->setChild(1, 2, new QStandardItem("隔壁老王"));
// 添加到模型中
model->setItem(0, root1); // 添加顶层节点2
// 可以直接设置,不声明变量
model->setItem(1, new QStandardItem("VIP班"));
// 添加子项
// 第一行
model->item(1, 0)->setChild(0,0,new QStandardItem("2309291"));
model->item(1, 0)->setChild(0,1,new QStandardItem("小曾"));
model->item(1, 0)->setChild(0,2,new QStandardItem("老曾"));
// 第二行
model->item(1, 0)->setChild(1,0,new QStandardItem("2307266"));
model->item(1, 0)->setChild(1, 1,new QStandardItem("小郑"));
model->item(1, 0)->setChild(1,2,new QStandardItem("老郑")); // 顶层节点3
model->setItem(2, new QStandardItem("神童班"));
// 第一行
model->item(2, 0)->setChild(0,0,new QStandardItem("23061685"));
model->item(2, 0)->setChild(0,1, new QStandardItem("小季"));
model->item(2, 0)->setChild(0, 2,new QStandardItem("扯牛堂认证医师老季"));
// 第二行
model->item(2, 0)->setChild(1,0,new QStandardItem("23064217"));
model->item(2, 0)->setChild(1,1,new QStandardItem("小陆"));
model->item(2, 0)->setChild(1,2,new QStandardItem("老陆"));
// 第三行
model->item(2, 0)->setChild(2,0, new QStandardItem("23031982"));
model->item(2, 0)->setChild(2,1,new QStandardItem("小严"));
model->item(2, 0)->setChild(2,2,new QStandardItem("严嵩第11代孙")); // 设置列标题
model->setHorizontalHeaderLabels({"学号", "姓名", "家长代表"});
// 把模型设置到视图
view->setModel(model);
view->setWindowTitle("厚黑幼儿园");
// 显示视图
view->show(); return QApplication::exec();
}

虽然在列表模型中,每个 QStandardItem 都可以把整个二维表作为子节点,而且任意行、列处的项都可以拥有子节点。但是,QTreeView 视图只允许第一列出现折叠效果,所以,对于可折叠的父节点,咱们用一列就可以了,就算设置了多列也没有效果的。不妨想一下,如果每个单元格都可以折叠,那么不仅这控件设计起来困难,而看起来也很混乱,用户没法用了。所以,QTreeView 只认第一列可以折叠。

model 的 setHorizontalHeaderLabels 方法用来设置水平方向上的标题,参数是一个字符串列表。水平方向就是列标题;如果是行标题,就是垂直方向,要调用 setVerticalHeaderLabels 方法。不过,行标题一般不怎么用,顶多显示行号。

最终显示的效果如下:

这个可以显示多列的 TreeView 真的很不错,可惜 .NET 中的 WinForms 和 WPF 自带控件 TreeView 没有这个玩法。

【Qt6】列表模型——树形列表的更多相关文章

  1. 数据库中树形列表(以easyui的tree为例)

    构造一棵easyui前台框架的一个树形列表为例后台框架是spring MVC+JPA. 先看一下数据库是怎么建的,怎么存放的数据 下面是实体类 /** * 部门类 用户所属部门(这里的部门是一个相对抽 ...

  2. Winform开发主界面菜单的动态树形列表展示

    我在之前很多文章里面,介绍过Winform主界面的开发,基本上都是标准的界面,在顶部放置工具栏,中间区域则放置多文档的内容,但是在顶部菜单比较多的时候,就需要把菜单分为几级处理,如可以在顶部菜单放置一 ...

  3. 如何快速开发树形列表和分页查询整合的WInform程序界面

    我在做Winform界面的时候,一般都是统一化处理,界面顶部放置一些字段条件供查询,下面就是分页查询列表,展示相关的数据.但有时候碰到一些表字段内容分类比较多,有一些特别重要,如果放在一个树形列表来进 ...

  4. 如何将数据库中存的树转化为树形列表(以easyui的tree为例)

    很多时候,我们会把一棵树存放到数据库中,当前台需要展示一个树形列表时,将这棵树读取出来并显示,这个过程是怎么实现的呢? 这篇文章是以构造一棵easyui前台框架的一个树形列表为例,后台框架是sprin ...

  5. 在Bootstrap开发框架中使用bootstrapTable表格插件和jstree树形列表插件时候,对树列表条件和查询条件的处理

    在我Boostrap框架中,很多地方需要使用bootstrapTable表格插件和jstree树形列表插件来共同构建一个比较常见的查询界面,bootstrapTable表格插件主要用来实现数据的分页和 ...

  6. Ajax-ajax实例3-动态树形列表

    项目结构: 项目演示: 技术要点: 1.3.2 技术要点在基本原理的介绍中,了解到通过在父节点内动态创建子节点,并利用样式表缩进完成树形列表的基本框架.除了这一点外,还有下面一些问题需要考虑.1 .将 ...

  7. Python操作符重载总结&列表模型

    操作符重载 二元运算符 特殊方法 + __add__,__radd__ - __sub__,__rsub__ * __mul__,__rmul__ / __div__,__rdiv__,__trued ...

  8. 网络采集软件核心技术剖析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)

    一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...

  9. java构建树形列表(带children属性)

    一些前端框架提供的树形表格需要手动构建树形列表(带children属性的对象数组),这种结构一般是需要在Java后台构建好. 构建的方式是通过id字段与父id字段做关联,通过递归构建children字 ...

  10. 【插件篇】前段bootstrap-table-treegrid试手,解决无法显示树形列表或者图标不显示问题。

    说明:具体代码操作我就不贴了.官方有正规的例子!bootstrap-table-examples传送 使用注意事项: 传入的id和pid可以是string类型的(我后台返回的是Long类型转换成str ...

随机推荐

  1. 逍遥自在学C语言 | 指针的基础用法

    前言 在C语言中,指针是一项重要的概念,它允许我们直接访问和操作内存地址. 可以说,指针是C语言一大优势.用得好,你写程序如同赵子龙百万军中取上将首级:用得不好,则各种问题层出不穷,有种双拳难敌四手的 ...

  2. 从零开始整SpringBoot-工具与插件

    工具 工具 名称 地址 IDEA https://www.jetbrains.com/idea/ JDK1.8 https://www.oracle.com/java/technologies/jav ...

  3. node使用jsonwebtoken生成token与验证是否过期

    场景 我们可以使用 cookie,session,token 来做鉴权. 下面我们来看一下, 如何使用 token 来做鉴权 jwt.sign 的简单介绍 npm install jsonwebtok ...

  4. K8S | 容器和Pod组件

    对比软件安装和运行: 一.场景 作为研发人员,通常自己电脑的系统环境都是非常复杂,在个人的习惯上,是按照下图的模块管理电脑的系统环境: 对于「基础设施」.「主机操作系统」.「系统软件」来说,通常只做配 ...

  5. C#中数组=out参数?

    - 结论 先上结论,答案是yes,C#中数组确实具有out参数的特性. - 疑问 最近开发一个上位机的功能,有段代码看得我一直很迷糊,我的认识,函数的执行结果,要么在函数中通过return返回,要么通 ...

  6. 基于AidLux的自动驾驶智能预警应用方案

    ### 1. 自动驾驶感知算法及AidLux相关方案介绍 #### 1.1自动驾驶 自动驾驶汽车,又称无人驾驶车.电脑驾驶车.无人车.自驾车,是一种需要驾驶员辅助驾驶或者完全不需要操控的车辆.作为自动 ...

  7. BOM和DOM相关API

    一.DOM相关API 1. DOM API DOM(Document Object Model)文档对象模型得树形结构 文档对象模型就是一个树形结构,类似于家谱树 html标签里面包裹了所有的文档内容 ...

  8. TCP超时分析

    参考链接: Linux 建立 TCP 连接的超时时间分析 Linux 建立 TCP 连接的超时时间分析 Linux 系统默认的建立 TCP 连接的超时时间为 127 秒. 2 分 7 秒即 127 秒 ...

  9. AttributeError: 'EmailUse' object has no attribute 'SendMail'

    错误原因:函数名与模块名重复 解决方案:不要将函数名与模块名重复

  10. python2.7源码安装方式

    安装python2.7 下载Python 2.7, 下载地址 解压安装 tar -xzvf Python-2.7.15.tgz cd Python-2.7.15 ./configure --prefi ...