QtC++与QTreeView详解

介绍

QTreeView 是 Qt 框架中的一个视图控件,用于显示树形结构的数据。它是 QAbstractItemView 类的子类,通常与数据模型结合使用。以下是 QTreeView 的详细讲解和在 Qt 中的作用:

QTreeView 的作用:

  1. 显示层次数据: 主要用于显示树形结构的数据,其中每个项目都可以包含子项目,从而形成层次结构。

  2. 展示文件系统: 常用于实现文件浏览器,通过 QFileSystemModel 可以方便地展示文件系统的层次结构。

  3. 显示数据库查询结果: 用于呈现数据库查询结果,数据库表中的关系可以以树形结构的形式展示。

  4. 显示配置选项: 适用于展示具有层次结构的配置选项,例如软件设置、选项和参数。

  5. 导航大量数据: 当需要导航大量层次化的数据时,QTreeView 提供了一种有效的方式来展示和浏览这些数据。

  6. 支持排序和过滤: 具有内置的排序和过滤功能,通过 QSortFilterProxyModel 可以对树形数据进行排序和过滤。

  7. 交互性强: 用户可以展开或折叠节点,选择一个或多个节点,以及对节点进行拖放操作。

  8. 自定义节点外观: 允许通过自定义委托 (QAbstractItemDelegate) 或者子类化 QTreeView 来实现自定义节点的外观和交互。

QTreeView 常用方法和信号:

以下是一些常用的方法和信号,可用于控制和响应 QTreeView 的行为:

  • setModel(QAbstractItemModel *model): 设置与 QTreeView 关联的数据模型。
  • setRootIndex(const QModelIndex &index): 设置树的根节点。
  • setSelectionMode(QAbstractItemView::SelectionMode mode): 设置选择模式,可以是单选、多选或无选择。
  • setSortingEnabled(bool enable): 启用或禁用排序。
  • setEditTriggers(QAbstractItemView::EditTriggers triggers): 设置编辑触发器,控制何时启用编辑功能。
  • expandAll(): 展开所有节点。
  • collapseAll(): 折叠所有节点。
  • clicked(const QModelIndex &index): 单击某个节点时触发的信号。
  • doubleClicked(const QModelIndex &index): 双击某个节点时触发的信号。

示例应用场景:

  1. 文件浏览器: QTreeView 可用于创建类似于资源管理器的文件浏览器,显示文件和文件夹的层次结构。

  2. 软件配置: 在软件设置中,可以使用 QTreeView 展示各种配置选项,使其具有清晰的层次结构。

  3. 数据库浏览: 在数据库工具中,QTreeView 可以显示数据库表和字段的关系,以及查询结果的层次结构。

  4. 任务管理器: QTreeView 可用于展示任务和子任务的层次结构,使用户能够清晰地了解任务之间的依赖关系。

  5. 图形场景: 在图形编辑器中,QTreeView 可以用于显示场景中的图形元素以及它们之间的层次关系。

注意事项:

  • 使用 QTreeView 时,通常需要一个合适的数据模型,例如 QStandardItemModelQFileSystemModel 或者自定义的模型类。

  • 当数据层次较大时,考虑启用排序和过滤以提高用户体验。

  • 对于复杂的节点外观和交互需求,可以通过自定义委托或者子类化 QTreeView 来实现。

结论:

QTreeView 是一个功能强

大的 Qt 控件,适用于展示树形结构的层次数据。它提供了丰富的功能和灵活性,使得开发者能够轻松创建各种树形结构的界面,并以清晰的方式展示层次化的数据。

举例

#include <QApplication>
#include <QTreeView>
#include <QFileSystemModel>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QDebug>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 示例1: 使用 QFileSystemModel 显示文件系统QTreeView fileSystemTreeView;QFileSystemModel fileSystemModel;fileSystemModel.setRootPath(QDir::rootPath());fileSystemTreeView.setModel(&fileSystemModel);fileSystemTreeView.setRootIndex(fileSystemModel.index(QDir::rootPath()));fileSystemTreeView.show();// 示例2: 使用 QStandardItemModel 创建树状结构QTreeView treeView;QStandardItemModel treeModel;// 创建根节点QStandardItem *rootItem = new QStandardItem("Root");// 创建子节点QStandardItem *childItem1 = new QStandardItem("Child 1");QStandardItem *childItem2 = new QStandardItem("Child 2");// 将子节点添加到根节点rootItem->appendRow(childItem1);rootItem->appendRow(childItem2);// 添加根节点到模型treeModel.appendRow(rootItem);treeView.setModel(&treeModel);treeView.show();// 示例3: 响应节点选择变化QObject::connect(&treeView, &QTreeView::clicked, [&](const QModelIndex &index) {qDebug() << "选中节点:" << treeModel.data(index, Qt::DisplayRole).toString();});// 示例4: 自定义节点数据QTreeView customDataTreeView;QStandardItemModel customDataModel;// 创建根节点QStandardItem *customRootItem = new QStandardItem("Root");// 创建包含自定义数据的子节点QStandardItem *customChildItem = new QStandardItem;customChildItem->setData("Custom Data", Qt::UserRole); // 使用 Qt::UserRole 存储自定义数据customRootItem->appendRow(customChildItem);// 添加根节点到模型customDataModel.appendRow(customRootItem);customDataTreeView.setModel(&customDataModel);customDataTreeView.show();// 示例5: 添加复选框QTreeView checkboxTreeView;QStandardItemModel checkboxModel;// 创建根节点QStandardItem *checkboxRootItem = new QStandardItem("Root");// 创建带有复选框的子节点QStandardItem *checkboxItem = new QStandardItem("Checkbox Item");checkboxItem->setCheckable(true);// 将子节点添加到根节点checkboxRootItem->appendRow(checkboxItem);// 添加根节点到模型checkboxModel.appendRow(checkboxRootItem);checkboxTreeView.setModel(&checkboxModel);checkboxTreeView.show();return app.exec();
}
#include <QApplication>
#include <QTreeView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QDebug>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 示例6: 添加右键菜单QTreeView contextMenuTreeView;QStandardItemModel contextMenuModel;// 创建根节点QStandardItem *contextMenuRootItem = new QStandardItem("Root");// 创建子节点QStandardItem *contextMenuItem = new QStandardItem("Context Menu Item");// 将子节点添加到根节点contextMenuRootItem->appendRow(contextMenuItem);// 添加根节点到模型contextMenuModel.appendRow(contextMenuRootItem);contextMenuTreeView.setModel(&contextMenuModel);contextMenuTreeView.show();// 示例7: 使用自定义委托QTreeView customDelegateTreeView;QStandardItemModel customDelegateModel;// 创建根节点QStandardItem *customDelegateRootItem = new QStandardItem("Root");// 创建子节点QStandardItem *customDelegateItem = new QStandardItem("Custom Delegate Item");// 将子节点添加到根节点customDelegateRootItem->appendRow(customDelegateItem);// 添加根节点到模型customDelegateModel.appendRow(customDelegateRootItem);customDelegateTreeView.setModel(&customDelegateModel);customDelegateTreeView.setItemDelegate(new QStyledItemDelegate); // 使用默认委托customDelegateTreeView.show();// 示例8: 排序和过滤QTreeView sortAndFilterTreeView;QStandardItemModel sortAndFilterModel;// 创建根节点QStandardItem *sortAndFilterRootItem = new QStandardItem("Root");// 创建子节点QStandardItem *sortAndFilterItem1 = new QStandardItem("Item 1");QStandardItem *sortAndFilterItem2 = new QStandardItem("Item 2");// 将子节点添加到根节点sortAndFilterRootItem->appendRow(sortAndFilterItem2);sortAndFilterRootItem->appendRow(sortAndFilterItem1);// 添加根节点到模型sortAndFilterModel.appendRow(sortAndFilterRootItem);sortAndFilterTreeView.setModel(&sortAndFilterModel);sortAndFilterTreeView.setSortingEnabled(true); // 启用排序sortAndFilterTreeView.show();return app.exec();
}
#include <QApplication>
#include <QTreeView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QDebug>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 示例9: 使用 QSortFilterProxyModel 进行排序和过滤QTreeView proxyModelTreeView;QStandardItemModel proxyModelModel;// 创建根节点QStandardItem *proxyModelRootItem = new QStandardItem("Root");// 创建子节点QStandardItem *proxyModelItem1 = new QStandardItem("Item 1");QStandardItem *proxyModelItem2 = new QStandardItem("Item 2");// 将子节点添加到根节点proxyModelRootItem->appendRow(proxyModelItem2);proxyModelRootItem->appendRow(proxyModelItem1);// 添加根节点到模型proxyModelModel.appendRow(proxyModelRootItem);proxyModelTreeView.setModel(&proxyModelModel);// 使用 QSortFilterProxyModel 进行排序和过滤QSortFilterProxyModel proxyModel;proxyModel.setSourceModel(&proxyModelModel);proxyModel.setFilterCaseSensitivity(Qt::CaseInsensitive);proxyModel.setFilterWildcard("Item*"); // 仅显示以 "Item" 开头的项目proxyModelTreeView.setModel(&proxyModel);proxyModelTreeView.show();// 示例10: 自定义节点数据结构QTreeView customDataStructureTreeView;QStandardItemModel customDataStructureModel;// 创建根节点QStandardItem *customDataStructureRootItem = new QStandardItem("Root");// 创建子节点QStandardItem *customDataStructureItem = new QStandardItem("Custom Data Structure Item");// 将子节点添加到根节点customDataStructureRootItem->appendRow(customDataStructureItem);// 添加根节点到模型customDataStructureModel.appendRow(customDataStructureRootItem);customDataStructureTreeView.setModel(&customDataStructureModel);// 获取和设置自定义节点数据结构QVariant customData("This is custom data");customDataStructureItem->setData(customData, Qt::UserRole + 1);QVariant retrievedData = customDataStructureItem->data(Qt::UserRole + 1);qDebug() << "Retrieved Data:" << retrievedData.toString();customDataStructureTreeView.show();return app.exec();
}

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

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

相关文章

ECharts:显示暂无数据

ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求&#xff0c;实现各种炫酷的统计图表效果。 如上图所示&#xff0c;有数据的时候固然好看&#xff0c;但是当它没有数据的时候&#xff0c;就是光秃秃的一片&#xff0c;所…

说说React Router有几种模式?实现原理?

一、是什么 在单页应用中,一个web项目只有一个html页面,一旦页面加载完成之后,就不用因为用户的操作而进行页面的重新加载或者跳转,其特性如下: 改变 url 且不让浏览器像服务器发送请求在不刷新页面的前提下动态改变浏览器地址栏中的URL地址其中主要分成了两种模式: has…

【GitHub】PR的学习笔记

PR流程 Fork the repository.Clone the fork-repo.Make the desired changes.Stage files: git add.Commit the changes: git commitPush them to the fork-online: git push.Create a pull request.

排序算法之-快速

算法原理 丛待排序的数列中选择一个基准值&#xff0c;通过遍历数列&#xff0c;将数列分成两个子数列&#xff1a;小于基准值数列、大于基准值数列&#xff0c;准确来说还有个子数列&#xff1a;等于基准值即&#xff1a; 算法图解 选出基准元素pivot&#xff08;可以选择…

[文件读取]shopxo 文件读取(CNVD-2021-15822)

1.1漏洞描述 漏洞编号CNVD-2021-15822漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: ShopXO是一套开源的企业级开源电子商务系统。 ShopXO存在任意文件读取漏洞&#xff0c;攻击者可利用该漏洞获取敏感信息。 1.2漏洞等级 高危 1.3影响版本 ShopXO 1.4漏洞复现…

【Git】第一篇:Git安装(centos)

git查看安装版本 以我自己的centos7.6为例&#xff0c;我们可以输入以下指令查看自己是否安装了git. git --version安装了的话就会显示自己安装的版本。 git 安装 安装很简单&#xff0c;一条命令即可 sudo yum install git -ygit 卸载 sudo yum remove git -y

《使用EasyExcel在Excel中增加序号列的方法》

《使用EasyExcel在Excel中增加序号列的方法》 1、简介2、正文3、核心代码4、使用方法5、效果 1、简介 在处理Excel文件时&#xff0c;有时候需要为表格增加序号列。本文介绍了如何使用Java代码实现在Excel中增加序号列的功能&#xff0c;并提供了一个示例代码。 2、正文 在处理…

神经风格转化

深入到神经风格转换的领域。你就会发现尽管NST在概念上很容易理解&#xff0c;但要生成高质量图像却出奇地困难。为了获得良好的结果&#xff0c;必须正确实施许多复杂的细节和未提及的技巧。在本文中&#xff0c;我们将深入研究神经风格转换的知识&#xff0c;并详细研究这些技…

【数学】Pair of Topics—CF1324D

Pair of Topics—CF1324D 思路 很明显&#xff0c;需要对 a i a j > b i b j a_i a_j > b_i b_j ai​aj​>bi​bj​ 化简&#xff1a; a i − b i > b j − a j a_i - b_i > b_j - a_j ai​−bi​>bj​−aj​ a i − b i > − ( a j − b j ) a_…

Android 图层列表 、 LayerDrawable 、 layer-list \ 改变 seekbar thumb 滑块 的颜色

android 官网 &#xff1a; 图层列表 LayerDrawable / layer-list LayerDrawable 是管理其他可绘制对象数组的可绘制对象。列表中的每个可绘制对象均按照列表顺序绘制。列表中的最后一个可绘制对象绘于顶部。 每个可绘制对象均由单个 <layer-list> 元素内的 <item>…

Jetson TX2 Ubuntu18.04安装ROS

1. 配置软件源 2. 使用aptitude解决依赖问题 3.一些报错 主要参考一下两个教程&#xff1a; https://zhuanlan.zhihu.com/p/372481181 https://blog.csdn.net/weixin_45266691/article/details/117427775 2. 安装完aptitude后&#xff0c;使用一下指令进行安装 sudo apti…

读书笔记:彼得·德鲁克《认识管理》第16章 使工作富有成效:核查与工具

一、章节内容概述 我们需要控制生产的方向、质量、数量、标准及经济性。控制是员工的工具&#xff0c;而不能反客为主成为做工的障碍。控制遵循经济原则而不是道德原则。控制不能处理例外情况&#xff0c;只能确保例外情况不会成为常规过程的障碍。控制必须符合常规的模式&…

【服务发现与配置】Consul特性及搭建

文章目录 一、前言二、概念2.1、什么是Consul&#xff1f;2.2、Consul具有哪些特点?2.3、Consul 架构图2.4、Consul的使用场景 三、安装3.1. 下载3.2. 解压3.3. 拷贝到usr目录下3.4. 查看 安装是否成功3.5. 启动 四、Consul 开机自启动4.1. 路径/usr/lib/systemd/system/&…

前端开发项目中使用字体库

开发中有些项目要求使用固定的字体&#xff0c;这就需要项目中使用字体库。 首先需要下载字体库 将下载的字体文件放进项目中 在项目代码样式文件中定义字体 font-face {font-family: "Tobias-SemiBold";src: url("./assets/font/Tobias-SemiBold.ttf"…

vscode因为大文件而无限崩溃的问题,窗口意外终止(原因:“oom“,代码:“-536870904“

复制了一大堆的代码&#xff08;好几兆&#xff09;到一个文件里&#xff0c;然后就导致 vscode 卡死&#xff0c; 之后就算把该文件删掉了&#xff0c;打开vscode还是会默认打开该文件而卡死 解决办法&#xff1a; win R 输入 %appdata%/code/ 删除该文件夹下的 backups/ 文件…

读书笔记:《精益数据分析》

《精益数据分析 . Lean Analytics Use Data to Build a Better Startup Faster》 加 . 阿利斯泰尔 . 克罗尔 本杰明 . 尤科维奇 著&#xff0c;韩知白 王鹤达 译 2023.7.27 ~ 2023.11.4 本以为是本纯数学的、介绍公式的数据分析用法的书&#xff0c;结果是&#xff1a;…

OpenCV 实现透视变换

一&#xff1a;OpenCV透视变换的概念 仿射变换(affine transform)与透视变换(perspective transform)在图像还原、图像局部变化处理方面有重要意义。通常&#xff0c;在2D平面中&#xff0c;仿射变换的应用较多&#xff0c;而在3D平面中&#xff0c;透视变换又有了自己的一席之…

ESP32 Arduino引脚分配参考:您应该使用哪些 GPIO 引脚?

ESP32 芯片有 48 个引脚&#xff0c;具有多种功能。并非所有 ESP32 开发板中的所有引脚都暴露出来&#xff0c;有些引脚无法使用。 关于如何使用 ESP32 GPIO 有很多问题。您应该使用什么引脚&#xff1f;您应该避免在项目中使用哪些引脚&#xff1f;这篇文章旨在成为 ESP32 GP…

21、Flink 的table API与DataStream API 集成(2)- 批处理模式和inser-only流处理

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

【2023.11.6】OpenAI发布会——近期chatgpt被攻击,不能使用

OpenAI发布会 写在最前面发布会内容GPT-4 Turbo 具有 128K 上下文函数调用更新改进了指令遵循和 JSON 模式可重现的输出和对数概率更新了 GPT-3.5 Turbo 助手 API、检索和代码解释器API 中的新模式GPT-4 Turbo 带视觉DALLE 3文字转语音 &#xff08;TTS&#xff09;收听语音样本…