【Qt笔记】QTreeView控件详解

news2024/9/25 9:32:56

目录

引言 

一、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.coloradmin.cn/o/2093278.html

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

相关文章

GPT-4 vs LLaMA3.1:核心技术架构与应用场景对比

目录 前言 一、GPT-4 的核心技术架构 1.1 Transformer 结构概述 1.2 GPT-4 的主要组成部分 1.3 GPT-4 的创新与改进 二、LLaMA3.1 的核心技术架构 2.1 模型概述 2.2 LLaMA3.1 的主要组成部分 2.3 LLaMA3.1 的创新与改进 三、GPT-4 和 LLaMA3.1 的主要差异 3.1 模型规…

遇到“Interpreter parsed an intent ‘xxx‘ which is not defined in the domain“报错

运行rasa shell的时候遇到如图报错&#xff1a; 从字面意思来看是这个”show_tasks”的intent没有在domain中定义。但是我打开domain.yml检查&#xff0c;domain里面是包含了这个intent的。那又是怎么回事呢&#xff1f; 遇到这个报错&#xff0c;不仅仅要检查domain.yml&…

c++ 红黑树(自平衡二叉搜索树)

目录 红黑树的概念 红黑树的由来 红黑树的性质 红黑树结点的定义 红黑树的插入 情况一&#xff1a;插入结点的叔叔存在&#xff0c;且叔叔的颜色是红色。 情况二&#xff1a;插入结点的叔叔存在且颜色是黑色 / 叔叔不存在&#xff0c; 情况A&#xff1a;p为g的左孩子&am…

Android 使用原生相机Camera在预览界面进行识别二维码或者图片处理

1 项目需求 最近项目中有个需求:使用原生相机在预览界面进行识别二维码和图片处理。其实这个需求不是很难,难在对预览画面的处理过程。 自己针对这个需求写了一个工具类,便于后续进行复盘,同时也分享给有类似需求的伙伴们。 2 遇到的问题 2.1 二维码识别成功率低 使用…

python网络爬虫(零)——认识网页结构

网页一般有三部分组成&#xff0c;分别是HTML&#xff08;超文本标记语言&#xff09;、CSS&#xff08;层叠样式表&#xff09;、JScript&#xff08;活动脚本语言&#xff09; 1.HTML HTML是整个网页的结构&#xff0c;相当于整个网站的框架。带“<”“>”符号都属于H…

Linux Grep案例

目录 一. 查询两个文件第一列的数据并去重二. 抽取日志中指定的字段三. 服务器指定时间点异常查询四. 从csv文件中抽取指定的数据五. 获取除了空白行和注释之外的部分 一. 查询两个文件第一列的数据并去重 &#x1f4da;file1.log 123 aaa 你好 345 bbb 我好 345 ccc 大家好 …

【最新华为OD机试E卷】空栈压数(200分)-多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

2024上海初中生古诗文大会备考:单选题真题和每道题独家解析

新的学年已经开始了&#xff0c;距离2024年初中生古诗文大会初选的线上自由报名选拔还有2个月&#xff08;官宣11月3日线上初选正式开赛&#xff09;&#xff0c;据好真题了解&#xff0c;有一些学校的老师已经开始准备校内选拔了&#xff0c;以古诗文大会作为一个抓手&#xf…

torch、torchvision、torchtext版本兼容问题

1、torch与torchtext版本兼容 参考torchtext PyPI 2、 torch与torchvision版本兼容 参考torchvision PyPI

喜羊羊做Python真题

以下内容&#xff0c;皆为原创&#xff0c;制作实属不易&#xff0c;感谢大家的关注和点赞。 一.全局变量和局部变量 首先&#xff0c;全局变量是ls和lt。我们可以看到&#xff0c;函数内部lt列表的值 赋值 给了ls的列表。在定义的函数里面&#xff0c;ls是局部变量&#xff…

云同步的使用

云同步技术是一种在多个设备或系统之间保持数据一致性的技术&#xff0c;它通常依赖于云存储服务来实现。在Java中&#xff0c;实现云同步功能通常需要与云服务提供商的API进行交互&#xff0c;如Amazon S3、Google Cloud Storage、Microsoft Azure Blob Storage等。 以下是一个…

报错:java:程序包org.springframework.boot不存在

Date: 2024.08.31 18:01:20 author: lijianzhan 简述&#xff1a;关于java:程序包org.springframework.boot不存在问题如何进行修复。 操作如下&#xff1a; 点击左侧菜单栏选择设置&#xff0c;弹框内选择构建,执行&#xff0c;部署----->构建工具点击Maven按键&#xf…

python实战三-提取Word数据到Excel

视频源码&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/83db5bb15383 一个文件夹下有大量会议通知文件&#xff0c;为word文件&#xff0c;文件格式都是一致的&#xff0c;现在要将文件中的一些字段提取出来汇总到Excel文件中。 会议通知文件格式如下&#xff1a; 要提…

Arthas线上诊断神器-如何安装?

文章目录 一、快速安装 ✅二、springboot-启动器 ✅ 一、快速安装 ✅ 第一种方式&#xff1a;通过下载arthas-boot.jar&#xff0c;然后用 java -jar 的方式启动&#xff5e; 第一步、下载arthas-boot.jar curl -O https://arthas.aliyun.com/arthas-boot.jar如果下载速度比较…

Linux镜像文件调整分区大小

本文介绍Linux镜像文件调整分区大小。 嵌入式系统在安装完Linux系统&#xff0c;磁盘通常默认只划分了2个分区&#xff0c;一个启动分区&#xff08;boot分区&#xff09;&#xff0c;一个根文件系统分区&#xff08;rootfs分区&#xff09;。有时&#xff0c;我们想划分一个独…

java打包混淆插件proguard

java代码混淆工具ProGuard混淆插件&#xff1a;https://blog.csdn.net/yinjl123/article/details/138922335 ProGuard Maven Plugin 使用指南&#xff1a;https://blog.csdn.net/gitblog_00427/article/details/141350545 ProGuard Maven Plugin 踩坑记 ProGuard代码混淆器如何…

火爆全网的扩散模型(Diffusion Model)到底是什么?只看这篇就够了!绝对通俗易懂!草履虫看完都要点头!| 附完整代码 + 详细注释

最近在做蛋白从头设计相关研究&#xff0c;看了超多文献&#xff08;后面也想慢慢把它们分享出来嘿嘿嘿&#xff09;&#xff01;发现现在最新的模型其实多数都是基于扩散模型&#xff08;Diffusion Model&#xff09;&#xff0c;既然如此&#xff0c;依据咱们要知道的尿性&am…

【Python进阶】学习Python必须要安装PyCharm。一篇文章带你总结一下安装PyCharm的注意事项,文末附带PyCharm激活码!!!

PyCharm激活码&#xff08;文末附带精品籽料&#xff09;&#xff1a; K384HW36OB-eyJsaWNlbnNlSWQiOiJLMzg0SFczNk9CIiwibGljZW5zZWVOYW1lIjoibWFvIHplZG9uZyIsImxpY2Vuc2VlVHlwZSI6IlBFUlNPTkFMIiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdG…

ComfyUI的优势+安装+基础介绍,干货内容,建议收藏!!!

简介 ComfyUI是一个基于节点流程的稳定扩散操作界面&#xff0c;通过流程实现了更加精准的工作流定制和完善的可复现性。 ComfyUI 与Webui 的区别&#xff1a; 一&#xff0c;界面设计&#xff1a; Web UI提供了直观友好的图形界面&#xff0c;适合初学者和非技术人员使用。…

JSON数据的解析与生成:深入Python的实践与应用

目录 一、JSON基础 1.1 JSON简介 1.2 Python中的JSON处理 二、解析JSON字符串到Python字典 2.1 使用json.loads()函数 2.2 异常处理 三、将Python字典转换为JSON字符串 3.1 使用json.dumps()函数 3.2 格式化输出 3.3 将Python对象写入文件 四、将Python对象写入JSON…