QtC++与QTreeView详解

news/2025/3/29 4:23:07/

介绍

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.ppmy.cn/news/1217326.html

相关文章

LeetCode Hot之七:438. 找到字符串中所有字母异位词

题目&#xff1a; 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 输入: s “cbaebabacd”,…

算法通关村第十五关白银挑战——海量数据场景下的热门算法题

大家好&#xff0c;我是怒码少年小码。 最近超级忙&#xff0c;很多实验报告&#xff0c;已经四五天没搞了&#xff0c;但是我还是回来了&#xff01; 海量数据场景下的热门算法题 本篇的题目不要求写代码&#xff0c;面试的时候能很清楚的说出思路就可以了。 1. 从40个亿中…

spring 整合 JUnit

大家好&#xff0c;本篇博客我们通过spring来整合JUnitt单元测试框架。 在之前篇章的测试方法中&#xff0c;几乎都能看到以下的两行代码&#xff1a; ApplicationContext context new ClassPathXmlApplicationContext("xxx.xml"); Xxxx xxx context.getBean(Xxx…

YOLO目标检测——苹果缺陷检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;苹果质量检测和自动化分拣系统数据集说明&#xff1a;苹果缺陷检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有缺陷图片和没缺陷图片。标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量…

【Linux】-文件系统的详解以及软硬链接

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

react脚手架create-react-app创建react项目

1.全局安装 create-react-app winR/桌面目录下cmd进入终端页面 npm i -g create-react-app2.create-react app 初始化项目 create-react-app 项目名称项目初始化完成 运行项目 目录下cmd控制台输入 npm start然后打开本地服务运行项目查看

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

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

TCP怎么实现可靠传输

链接 1&#xff0c;TCP头部的校验和保证获取正确数据&#xff0c;防篡改&#xff1b; 2&#xff0c;序列号和ACK确认机制同于管理数据包&#xff0c;对接收到的数据包进行确认&#xff0c;对没有接收到的数据包进行重传&#xff1b; 3&#xff0c;重传机制&#xff0c;包括超…