【Qt6】列表模型——树形列表

这篇具有很好参考价值的文章主要介绍了【Qt6】列表模型——树形列表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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);

最终效果可以看下图:

【Qt6】列表模型——树形列表

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

viewWind->setHeaderHidden(true);

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

这样看起来就顺眼多了。

【Qt6】列表模型——树形列表

 文章来源地址https://www.toymoban.com/news/detail-710238.html

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 方法。不过,行标题一般不怎么用,顶多显示行号。

最终显示的效果如下:

【Qt6】列表模型——树形列表

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

 

到了这里,关于【Qt6】列表模型——树形列表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt6之模型和视图

    MVC是Model-View-Controller,即 模型 (Model)、 视图 (View)、 控制器 (Controller)。 模型 :用于管理数据; 视图 :就是呈现在用户面前的界面外观,视图负责把模型中的数据显示给用户; 控制器 :用于处理用户在用户界面的输入; MVC本质上目的是数据处理和显示分离,以提高灵活性

    2024年02月15日
    浏览(37)
  • 【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

    QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化 简介 本文介绍了QT模型视图代理框架中的QT表格控件和QT数据库模块中的QT数据库查询模型结合使用的一个应用实践案例:QT高性能表格控件分页展示千万行数据。本文介绍了这个应用实践案例的运行效果

    2024年02月14日
    浏览(51)
  • 树形结构的节点作为查询参数业务

      有一个树结构,存在一个唯一的code和一个父节点的pcode,要求前端传入任意层的code匹配这个code对应的所有子节点对应的数据。   因为无法判定传入的code到底在那层,so 直接递归调用查询判断,如果有子节点就继续差,如果没有子节点,说明当前节点就是最后节点,直接写

    2024年02月09日
    浏览(44)
  • QT6 for android 安装教程记录(版本Qt6.5.2)

    本文记录首次安装QT for andriod的详细记录。 网上的信息和资料非常多,收集和整理以及遇到的问题也各异,对新手首次接触相关开发和部署环境并不是清晰,因此,特将相关详细配置记录。 首先,开发QT for andriod 不建议使用QT5.15的版本,因为该版本不能区分相关的CPU架构,而

    2024年02月03日
    浏览(50)
  • WPF实现树形下拉列表框(TreeComboBox)

    前言 树形下拉菜单是许多WPF应用程序中常见的用户界面元素,它能够以分层的方式展示数据,提供更好的用户体验。本文将深入探讨如何基于WPF创建一个可定制的树形下拉菜单控件,涵盖从原理到实际实现的关键步骤。 一、需求分析       树形下拉菜单控件的核心是将Co

    2024年04月08日
    浏览(132)
  • Qt6中使用Qt Charts

     官方文档:Qt Charts 6.5.2           如果你是使用  CMake 构建的,则应在  CMakeLists.txt  中添加如下两行代码:         其中  mytarget 为你的项目名称。一共2处改动,如下截图:         改完之后,你在 .cpp 文件导入库名,就可以开始画图了。         关于怎么画出一个可

    2024年02月09日
    浏览(38)
  • 【QT教程】QT6物联网应用

    QT6物联网应用 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C++扩展开发视频课程 免费QT视频课程 您可以看免费1000+个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免费QT视

    2024年04月25日
    浏览(36)
  • 【Qt6】QStringList

    2023年10月31日,周二上午 QStringList 是 Qt 中的一个类,用于存储一组字符串。它提供了一些方便的方法来操作和管理字符串列表。 QStringList 可以用于存储任意数量的字符串,并提供了一些常用的操作,例如添加、删除、查找、排序等。它是基于 QStringList 类的 QVectorQString 的封装

    2024年02月06日
    浏览(36)
  • Qt5和Qt6的区别

    Qt4和Qt5的区别 之前有做过将项目从QT4迁移到QT5的操作,所以写了一篇QT4和Qt5的区别。在最近这一年接触过Qt6后,所以想要介绍一下Qt6和Qt5的区别,通过自己的试用感受和结合网上各路大佬的点拨,有了一个大概的了解。 各稳定版本: Qt4: 4.8.7 4.X 系列终结版本 Qt5 : 5.6 LTS 长期

    2024年01月18日
    浏览(51)
  • 【Qt6】嵌套 QWindow

    在上个世纪的文章中,老周简单介绍了 QWindow 类的基本使用——包括从 QWindow 类派生和从 QRasterWindow 类派生。 其实,QWindow 类并不是只能充当主窗口用,它也可以嵌套到父级窗口中,变成子级对象。咱们一般称之为【控件】。F 话不多讲,下面咱们用实际案例来说明。 这个例

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包