Qt应用开发(基础篇)——树结构视图 QTreeView

2023-10-13 14:36

本文主要是介绍Qt应用开发(基础篇)——树结构视图 QTreeView,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

        QTreeView类继承于QAbstractItemView类,提供了一个树结构视图的模型。

        视图基类 QAbstractItemView

        QTreeView默认为Model/View实现,下面是一个使用QFileSystemModelQTreeView的结合,显示系统文件结构的实例。

QFileSystemModel *model = new QFileSystemModel;
model->setRootPath(QDir::currentPath());
QTreeView *tree = new QTreeView(splitter);
tree->setModel(model);

        正常场景下,我们需要根据数据动态去生成树结构,这时候使用QStandardItemModel实现树结构的数据。

QStandardItemModel *model = new QStandardItemModel;
ui->treeView->setModel(model);
QStandardItem *item = new QStandardItem;
item->setText("000");
model->appendRow(item);
insterTreeNode("aaa",item);
insterTreeNode("bbb",item);
insterTreeNode("ccc",item);
insterTreeNode("ddd",item);
ui->treeView->expandAll();void MainWindow::insterTreeNode(QString str,QStandardItem *parent)
{QStandardItem *item = new QStandardItem;item->setText(str);parent->appendRow(item);
}

        QTreeView树视图提供了一些公共属性和类方便程序员结构进行设计。使用expandAll()collapseAll()展开和折叠全部的节点,当发现折叠或者展开的时候,发出collapsed() expanded()信号。QTreeView带有标题头封装在QHeaderView中。

        QTreeView默认与一些按键绑定,使用户能够在视图中导航并与项的内容交互。

按键作用描述
上键Up将光标移动到前一行同一列中的项。如果当前项的父项没有更多的行可导航,则光标移动到父项前面的兄弟项的最后一行中的相关项。
下键Down将光标移动到下一行同一列中的项。如果当前项的父项没有更多的行可导航,则光标移动到其父项后面的兄弟项的第一行中的相关项。
左键Left通过折叠分支隐藏当前项的子项。
减号键Minus和Left一样
右键Right通过展开分支显示当前项的子项
加号键Plus和Right一样
星号键Asterisk展开当前项及其所有子项
上翻页PageUp将光标向上移动一页。
下翻页PageDown将光标向下移动一页。
主页Home将光标移动到模型中第一个顶级项的第一行同一列中的项。
尾页End将光标移动到模型中最后一个顶级项的最后一行同一列中的项。
F2在可编辑模型中,这将打开当前项进行编辑。Escape键可用于取消编辑过程并恢复对所显示数据的任何更改。

二、QTreeView

1、属性

1)allColumnsShowFocus

        该属性表示项是否应该使用所有列显示键盘焦点,默认值为false。

        如果此属性为真,则所有列将显示焦点,否则只有一列显示焦点。

bool allColumnsShowFocus() const
void setAllColumnsShowFocus(bool enable)
2)animated

        该属性表示是否启用动画,默认为False。

        如果此属性为true,树视图将动画展开和折叠分支。

        如果此属性为false,树视图将立即展开或折叠分支而不显示动画。

bool isAnimated() const
void setAnimated(bool enable)
3)expandsOnDoubleClick

        该属性表示是否双击展开节点,默认为true。

bool expandsOnDoubleClick() const
void setExpandsOnDoubleClick(bool enable)
4)headerHidden

        该属性表示是否隐藏头标题,默认为false。

bool isHeaderHidden() const
void setHeaderHidden(bool hide)
5)autoExpandDelay

        该属性表示在拖放操作期间打开或关闭树中的项之前的延迟时间(以毫秒为单位)。如果时间被设置为小于0,那么它将不会被激活。默认情况下,此属性的值为-1,意味着禁用自动扩展。

int autoExpandDelay() const
void setAutoExpandDelay(int delay)
6)indentation

        该属性表示树视图中每个级别的项目以像素为单位测量的缩进。对于顶级项目,缩进指定从视口边缘到第一列项目的水平距离,对于子项,它指定它们与父项之间的缩进。

        默认情况下,此属性的值与样式相关。因此,当样式更改时,此属性将从它更新。调用setIndentation()停止更新,调用resetIndentation()将恢复默认行为。

int indentation() const
void setIndentation(int i)
void resetIndentation()
7)itemsExpandable

        该属性表示项用户是否可以交互展开和折叠项,默认为true。

bool itemsExpandable() const
void setItemsExpandable(bool enable)
8)rootIsDecorated

        该属性表示是否显示展开和折叠顶级项的控件,默认为true。

        带有子项目的项目通常显示为展开和折叠它们的控件,从而允许显示或隐藏它们的子项目。如果此属性为false,则不会为顶级项显示这些控件。这可以使单个级别的树结构看起来像一个简单的项目列表。

bool rootIsDecorated() const
void setRootIsDecorated(bool show)
9)sortingEnabled

        该属性表示是否启用排序,默认为false。

bool isSortingEnabled() const
void setSortingEnabled(bool enable)

        在实例二代码中我们修改代码添加排序,展示的结果子项实现倒序排序。

QStandardItemModel *model = new QStandardItemModel;
ui->treeView->setModel(model);
QStandardItem *item = new QStandardItem;
item->setText("000");
model->appendRow(item);
insterTreeNode("aaa",item);
insterTreeNode("bbb",item);
insterTreeNode("ccc",item);
insterTreeNode("ddd",item);
ui->treeView->expandAll();
ui->treeView->setSortingEnabled(true);
ui->treeView->sortByColumn(0);

 

10)uniformRowHeights

        该属性表示是否让视图中的所有项目具有相同的高度,默认为false。只有在保证视图中的所有项具有相同高度时,才应该将此属性设置为true,这使视图能够进行一些优化。

bool uniformRowHeights() const
void setUniformRowHeights(bool uniform)
11)wordWrap

        该属性表示是否启用换行,默认为false。启用该属性,则文本将在需要的位置进行换行,如果不换行则需要设置textElideMode,它能够把超出范围的值显示为省略号。

bool wordWrap() const
void setWordWrap(bool on)

2、公共函数

1)columnAt

        返回给定x坐标所在的行序号。

int columnAt(int x) const
2)columnViewportPosition

        返回给定行号所在的视窗中的水平位置。

int columnViewportPosition(int column) const
3)columnWidth

        返回给定行号的宽度。

int columnWidth(int column) const
4)setColumnWidth

       设置给定行号的宽度。

void setColumnWidth(int column, int width)
5)header

       返回头标题信息,封装在QHeaderView中。

QHeaderView *header() const
6)indexAbove

        返回在给定模型上面的模型。

QModelIndex indexAbove(const QModelIndex &index) const
7)indexBelow

        返回在给定模型下面的模型。

QModelIndex indexBelow(const QModelIndex &index) const
8)isColumnHidden

        返回给定的列是否隐藏。

bool isColumnHidden(int column) const
9)isRowHidden

        返回给定的行是否隐藏。

bool isRowHidden(int row, const QModelIndex &parent) const
10)isFirstColumnSpanned

        如果父元素给定行的第一列中的项跨越所有列,则返回true;否则返回false。

bool isFirstColumnSpanned(int row, const QModelIndex &parent) const
11)setFirstColumnSpanned

        如果span为true,则具有给定父元素的行中第一列中的项被设置为跨所有列,否则显示该行上的所有项。

void setFirstColumnSpanned(int row, const QModelIndex &parent, bool span)
12)setTreePosition

        指定树结构应该放在逻辑索引索引处。如果设置为-1,则树将始终跟随视觉索引0。

void setTreePosition(int index)
13)treePosition

        返回设置树的逻辑索引。如果返回值为-1,则树被放置在可视索引0上。

int treePosition() const

3、公共槽函数

1)collapse

        折叠给定的节点。

void collapse(const QModelIndex &index)
2)collapseAll

        折叠全部的节点。

void collapseAll()
3)expand

        展开给定的节点。

void expand(const QModelIndex &index)
4)expandAll

        展开全部的节点。

void expandAll()
5)expandRecursively

        展开节点带深度,如果是-1则展开全部节点,如果是0则展开给定的索引。

void expandRecursively(const QModelIndex &index, int depth = -1)
6)expandToDepth

        展开节点带深度,如果是-1则展开全部节点,如果是0则展开给定的索引。

void expandToDepth(int depth)
7)hideColumn

        隐藏给定的列。

void hideColumn(int column)
8)resizeColumnToContents

        恢复列的宽度设置。

void resizeColumnToContents(int column)
9)showColumn

       显示给定的列。

void showColumn(int column)
10)sortByColumn

       升序或者降序进行排序。

void sortByColumn(int column, Qt::SortOrder order)

4、信号

1)collapsed

        有节点折叠的时候信号产生。

void collapsed(const QModelIndex &index)
2)expanded

        有节点展开的时候信号产生。

void expanded(const QModelIndex &index)

这篇关于Qt应用开发(基础篇)——树结构视图 QTreeView的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/203902

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库