【Qt笔记】QTreeView控件详解

目录

引言 

一、QTreeView的基本用法

1. 创建QTreeView

2. 设置数据模型

3. 展开和折叠节点

4. 处理用户交互

二、自定义数据模型

1. 继承QAbstractItemModel

2. 实现必要的方法

3. 使用自定义模型

三、自定义视图和委托

1. 自定义视图

2. 自定义委托

四、过滤与排序

1. 排序

2. 过滤

五、拖放支持

1. 启用拖放

2. 处理拖放事件

六、应用场景示例

文件系统浏览器

实现效果 

结语 


引言 

QTreeView是Qt框架中一个非常重要的控件,用于展示和操作层次化或树形结构的数据。它基于模型/视图架构,通过与数据模型的结合,实现了数据的灵活展示和用户交互。本文将详细解析QTreeView的各个方面,包括基本用法、自定义模型、视图和委托的创建、过滤与排序、拖放支持等,并附带代码示例以帮助理解。

一、QTreeView的基本用法

1. 创建QTreeView

首先,你需要在Qt项目中包含QTreeView的头文件,并在适当的位置创建QTreeView的实例。

#include <QTreeView>  // ...  QTreeView *treeView = new QTreeView(parentWidget);

其中,parentWidget是QTreeView的父窗口或控件,如果不需要父对象,可以传入nullptr。 

2. 设置数据模型

QTreeView本身不存储数据,而是通过与数据模型(如QStandardItemModel、QFileSystemModel等)的结合来展示数据。你需要先创建一个数据模型,并将其设置给QTreeView。

#include <QStandardItemModel>  // ...  QStandardItemModel *model = new QStandardItemModel();  
// 假设我们添加一些数据  
QStandardItem *rootNode = model->invisibleRootItem();  
QStandardItem *parentItem = new QStandardItem("Parent");  
QStandardItem *childItem = new QStandardItem("Child");  parentItem->appendRow(childItem);  
rootNode->appendRow(parentItem);  treeView->setModel(model);

3. 展开和折叠节点

QTreeView提供了多种方法来展开和折叠节点。

// 展开第一个父节点  
QModelIndex parentIndex = model->index(0, 0);  
treeView->expand(parentIndex);  // 展开所有节点  
treeView->expandAll();  // 折叠所有节点  
treeView->collapseAll();

4. 处理用户交互

QTreeView提供了多种信号,如clicked(), doubleClicked(), selectionChanged()等,用于处理用户交互。

connect(treeView, &QTreeView::clicked, this, &MyClass::onItemClicked);  // ...  void MyClass::onItemClicked(const QModelIndex &index) {  // 处理单击事件  qDebug() << "Clicked item:" << index.data().toString();  
}

二、自定义数据模型

当内置的数据模型(如QStandardItemModel)不满足需求时,你可以创建自定义的数据模型。

1. 继承QAbstractItemModel

自定义模型需要继承自QAbstractItemModel或其子类,并实现必要的方法和信号。

#include <QAbstractItemModel>  class MyModel : public QAbstractItemModel {  Q_OBJECT  public:  // 实现必要的接口方法,如index(), parent(), rowCount(), columnCount(), data(), setData()等  // ...  
};

2. 实现必要的方法

在自定义模型中,你需要实现如index(), parent(), rowCount(), columnCount(), data(), setData()等方法来提供对数据的访问和操作。

3. 使用自定义模型

创建并填充自定义模型后,可以将其设置给QTreeView来显示数据。

MyModel *myModel = new MyModel();  
// 假设已经填充了数据  
treeView->setModel(myModel);

三、自定义视图和委托

1. 自定义视图

自定义视图通常通过继承QTreeView类并重写特定方法来实现。但大多数情况下,QTreeView的默认行为已经足够,你可能只需要通过委托来自定义节点的外观和交互。

2. 自定义委托

自定义委托通过继承QAbstractItemDelegate或更具体的QStyledItemDelegate类来实现。在委托中,你可以重写paint()和editorEvent()等方法来自定义节点的绘制和编辑行为。

#include <QStyledItemDelegate>  
#include <QPainter>  class MyDelegate : public QStyledItemDelegate {  
public:  using QStyledItemDelegate::QStyledItemDelegate;  void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {  // 自定义绘制逻辑  // ...  }  // 如果需要编辑功能,也需要重写editorEvent()方法  
};  // ...  treeView->setItemDelegate(new MyDelegate(treeView));

四、过滤与排序

1. 排序

QTreeView支持通过QSortFilterProxyModel对数据进行排序。

#include <QSortFilterProxyModel>  // ...  QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel();  
proxyModel->setSourceModel(model);  
proxyModel->sort(0); // 根据第一列排序  treeView->setModel(proxyModel);

2. 过滤

QSortFilterProxyModel同样支持过滤功能,通过重写其filterAcceptsRow()方法或设置filterRegExp、filterKeyColumn等属性来实现。

// 假设我们只想显示包含"特定文本"的行  
proxyModel->setFilterRegExp(QRegExp("特定文本", Qt::CaseInsensitive));

五、拖放支持

QTreeView支持拖放操作,允许用户通过拖放来重新组织树形结构中的数据。

1. 启用拖放

首先,需要在QTreeView上启用拖放功能。

treeView->setDragEnabled(true);  
treeView->setAcceptDrops(true);  
treeView->setDropIndicatorShown(true);

2. 处理拖放事件

然后,你需要在自定义模型或视图中重写拖放事件处理函数(如mimeTypes(), mimeData(), dropMimeData()等),以处理拖放操作。

六、应用场景示例

文件系统浏览器

使用QTreeView和QFileSystemModel可以方便地创建一个文件系统浏览器。

#include <QTreeView>  
#include <QFileSystemModel>  // ...  QTreeView *treeView = new QTreeView(parentWidget);  
QFileSystemModel *fileSystemModel = new QFileSystemModel();  
fileSystemModel->setRootPath(QDir::rootPath());  treeView->setModel(fileSystemModel);  
treeView->setRootIndex(fileSystemModel->index(QDir::homePath()));

实现效果 

结语 

QTreeView是Qt框架中一个功能强大的控件,它基于模型/视图架构,提供了对树形数据的灵活展示和操作。通过自定义数据模型、视图和委托,以及利用过滤、排序和拖放等高级功能,QTreeView可以满足各种复杂的应用需求。希望本文的解析和代码示例能够帮助你更好地理解和使用QTreeView。 

以上就是关于Qt中QTreeView的全部介绍,如有不足与缺陷之处,欢迎评论区留言!!!  

 

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

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

相关文章

C++ | Leetcode C++题解之第378题有序矩阵中第K小的元素

题目&#xff1a; 题解&#xff1a; class Solution { public:bool check(vector<vector<int>>& matrix, int mid, int k, int n) {int i n - 1;int j 0;int num 0;while (i > 0 && j < n) {if (matrix[i][j] < mid) {num i 1;j;} else…

YOLOv9改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型

一、本文介绍 本文记录的是基于MobileNet V3的YOLOv9目标检测轻量化改进方法研究。MobileNet V3的模型结构是通过网络搜索得来的&#xff0c;其中的基础模块结合了MobileNet V1的深度可分离卷积、MobileNet V2的线性瓶颈和倒置残差结构以及MnasNet中基于挤压和激励的轻量级注意…

python-Flask搭建简易登录界面

使用Flask框架搭建一个简易的登录界面&#xff0c;登录成功获取token数据 1 搭建简易登录界面 代码如下 from flask import Flask, jsonify from flask import request import time, hashlibapp Flask(__name__)login_html <html> <head> <title>Log…

day7 测试知识积累

1.有一个班级表,里面有学号,姓名,学科,分数。找到语文学科分数最高的前10位的姓名(SQL) select 姓名 from 班级表 where 学科=语文 order by 分数 DESC limit 10; 2.有一张年级表,有班级,年级,学生姓名,找到这10名同学所在的班级(SQL) select class from 年级表 wher…

图片转为PDF怎么弄?看这里,三款软件助你一键转换!

嘿&#xff0c;朋友们&#xff01;现在信息这么多&#xff0c;图片在我们学习、工作、生活中帮了大忙。但有时候&#xff0c;我们想把图片整理好、分享给别人或者打印出来&#xff0c;PDF格式就特别合适。PDF文件不管在哪儿打开&#xff0c;内容都不会变样&#xff0c;还能加密…

【CVPR‘24】DeCoTR:使用 2D 和 3D 注意力增强深度补全

DeCoTR: Enhancing Depth Completion with 2D and 3D Attentions DeCoTR: Enhancing Depth Completion with 2D and 3D Attentions 中文解析摘要介绍方法方法3.1 问题设置3.2 使用高效的 2D 注意力增强基线3.3 3D中的特征交叉注意力点云归一化位置嵌入3.4 捕捉 3D 中的全局上下…

Ubuntu 安装个人热点

1. 安装必要的软件 首先&#xff0c;我们需要确保有一些工具已经装好&#xff0c;这些工具会帮助我们创建 Wi-Fi 热点。打开终端&#xff0c;输入以下命令来安装这些工具&#xff1a; sudo apt-get install git hostapd iptables dnsmasq 2. 下载并安装 create_ap 我们接下来…

【我的Android进阶之旅】快来给你的Kotlin代码添加Markdown格式的注释吧!

文章目录 一、 传统 HTML 格式注释二、 Markdown 格式注释三.、Markdown格式注释详解3.1. 基础语法3.1.1 单行注释3.1.1 多行注释3.2 标题3.3 列表3.4 加粗和斜体3.5 代码块3.6 链接3.7 引用3.8 表格3.9. 图片3.10. 示例代码3.11. 注释模板的使用场景3.12 实例示例四、总结在 A…

Vue面试常见知识总结2——spa、vue按需加载、mvc与mvvm、vue的生命周期、Vue2与Vue3区别

SPA SPA&#xff08;Single Page Application&#xff0c;单页面应用&#xff09;是一种Web应用程序架构&#xff0c;其核心特点是在用户与应用程序交互时&#xff0c;不重新加载整个页面&#xff0c;而是通过异步加载页面的局部内容或使用JavaScript动态更新页面。以下是对SPA…

突破代码:克服编程学习中的挫折感

目录 一、心态调整&#xff1a;心理韧性的培养 接受挫折是学习的一部分 设置实际的学习目标 保持学习的乐趣 二、学习方法&#xff1a;策略的实施 逐步解决问题 寻找多样的学习资源 定期复习与实践 三、成功经验&#xff1a;实例的启示 Debug的技巧掌握 算法的深入理…

APP测试(十一)

APP测试要点提取与分析 一、功能测试 APP是什么项目&#xff1f;核心业务功能梳理清楚 — 流程图分析APP客户端的单个功能模块 — 细化分析 需要使用等价类&#xff0c;边界值&#xff0c;考虑正常和异常情况&#xff08;长度&#xff0c;数据类型&#xff0c;必填&#xff0…

【微机原理】v和∧区别

&#x1f31f; 嗨&#xff0c;我是命运之光&#xff01; &#x1f30d; 2024&#xff0c;每日百字&#xff0c;记录时光&#xff0c;感谢有你一路同行。 &#x1f680; 携手启航&#xff0c;探索未知&#xff0c;激发潜能&#xff0c;每一步都意义非凡。 在汇编语言和逻辑表达…

【C++ Primer Plus习题】8.7

问题: 解答: #include <iostream>using namespace std;template <typename T> T SumArray(T arr[], int n) {T sum arr[0] - arr[0];for (int i 0; i < n; i){sum arr[i];}return sum; }template <typename T> T SumArray(T *arr[], int n) {T sum *…

Vue3:通信组件

1.Props 父传子&#xff1a;直接传递需要获取的属性 子传父&#xff1a;需要借助函数&#xff0c;也就是方法&#xff0c;通过传递函数&#xff0c;子接着入参给函数&#xff0c;父调用函数即可获取到参数。 父&#xff1a; <template><div class"father&quo…

python破解[5分钟解决拼多多商家后台字体加密]

可【QQ群】拿源码 进入经营总览想把数据存下来发现返回的json数据部分空白如下 这可怎么办 稳住应该是字体的问题&#xff0c;可能是多多自己实现了某种字体&#xff0c;我们去找他的js 发现如我们所想&#xff0c;进行跟踪&#xff0c;发现的确是在css端进行了字体替换&am…

【高阶数据结构】图的应用--最小生成树

一、最小生成树 连通图中的每一棵生成树&#xff0c;都是原图的一个极大无环子图&#xff0c;即&#xff1a;从其中删去任何一条边&#xff0c;生成树就不在连通&#xff1b;反之&#xff0c;在其中引入任何一条新边&#xff0c;都会形成一条回路。 若连通图由n个顶点组成&am…

华为云征文|基于Flexus云服务器X实例的应用场景-部署脚手架开源项目若依

&#x1f534;大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 先看这里 写在前面**Flexus X实例**的云服务器简介环境准备若依项目拉取导入数据库启动本地项目&#xff08;后端&#xff09;启动本地项目&#xff08;前端&#xff09;打包后…

Linux——性能调优工具一览

一、CPU 1.调优工具 根据指标找工具 性能指标工具说明 平均负载 uptime、top uptime最简单、top提供了更全的指标 系统整体CPU使用率 vmstat、mpstat、top、sar、/proc/stat top、vmstat、mpstat只可以动态查看&#xff0c;而sar还可以记录历史数据 /proc/stat是其他性…

【知识图谱】4、LLM大模型结合neo4j图数据库实现AI问答的功能

昨天写了一篇文章&#xff0c;使用fastapi直接操作neo4j图数据库插入数据的例子&#xff0c; 本文实现LLM大模型结合neo4j图数据库实现AI问答功能。 废话不多说&#xff0c;先上代码 import gradio as gr from fastapi import FastAPI, HTTPException, Request from pydantic…

HarmonyOS开发实战( Beta5版)耗时分析器Time Profiler实践指导

DevEco Studio集成的DevEco Profiler性能调优工具&#xff08;以下简称为Profiler&#xff09;&#xff0c;提供Time、Allocation、Snapshot、CPU等场景化分析任务类型。开发应用或服务过程中&#xff0c;如果遇到卡顿、加载耗时等性能问题&#xff0c;开发者通常会关注相关函数…