树控件QTreeWidget

news2024/12/23 4:13:47

树控件跟表格控件类似,也可以有多列,也可以只有1列,可以有多行,只不过每一行都是一个QTreeWidgetItem,每一行都是一个可以展开的树

常用属性和方法

显示和隐藏标题栏

树控件只有水平标题栏

//获取和设置标题栏的显隐
bool isHeaderHidden() const
void setHeaderHidden(bool hide)

//隐藏标题栏
tree->setHeaderHidden(true);

 还可以先获取到树控件的标题栏,然后调用标题栏的方法,来设置标题栏是否可见

//设置标题栏是否可见
void QHeaderView::setVisible(bool v)

//隐藏标题栏
tree->header()->setVisible(false);

点击标题栏排序

//获取和设置标题栏是否开启了排序
bool isSortingEnabled() const
void setSortingEnabled(bool enable)

//开启排序
tree->setSortingEnabled(true);

 开启点击标题栏会出现一个排序箭头,点击标题栏,就会根据当前列排序

动画效果

开启树控件里面的条目展开时会有一个缓冲效果,而不是立即展开

//获取和设置动画效果
bool isAnimated() const
void setAnimated(bool enable)


//开启动画效果
tree->setAnimated(true);

没开启:

开启了,条目的展开有一定的缓冲:

 滚动条的显示和隐藏

//设置和获取水平滚动条的显隐
Qt::ScrollBarPolicy horizontalScrollBarPolicy() const
void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)

//设置和获取垂直滚动条的显隐
Qt::ScrollBarPolicy verticalScrollBarPolicy() const
void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)


//隐藏水平和垂直滚动条
tree->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
tree->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

Qt::ScrollBarPolicy有三种取值:

  • Qt::ScrollBarAsNeeded,控件宽高太小导致内容显示不全时滚动条会出现
  • Qt::ScrollBarAlwaysOff,总是关闭
  • Qt::ScrollBarAlwaysOn,总是开启

开启:

选择模式

单选、多选、按住ctrl键多选,shift键多选...

//获取和设置控件的选择模式
QAbstractItemView::SelectionMode selectionMode() const
void setSelectionMode(QAbstractItemView::SelectionMode mode)


//设置为多选,既可以按shift也可以按ctrl键选择
tree->setSelectionMode(QAbstractItemView::ExtendedSelection);

 mode有5种取值:

  • QAbstractItemView::SingleSelection,只能但选
  • QAbstractItemView::ContiguousSelection,按住ctrl键可以多选
  • QAbstractItemView::ExtendedSelection,按住ctrl或者shift键可以多选
  • QAbstractItemView::MultiSelection,只要点击就能多选
  • QAbstractItemView::NoSelection,不能选择

按住ctrl或者shift键可以多选:

选择行为

选择时是选择单个条目、或者一整行 ,一整列

//获取和设置控件的选择行为
QAbstractItemView::SelectionBehavior selectionBehavior() const
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)


//设置为选择时只能选择单个
tree->setSelectionBehavior(QAbstractItemView::SelectItems);

behavior有三种取值:

  • QAbstractItemView::SelectItems,每次点击时只能选中单个
  • QAbstractItemView::SelectRows,每次点击时选中整行
  • QAbstractItemView::SelectColumns,每次点击时选中整列

QTreeWidgetItem

树形控件里面的条目是QTreeWidgetItem,是一个树形结构,我们对树控件增删改查就是在操作这个类,先说一下他里面的方法

  • 文本
//获取和设置item里面某一列的文本
QString QTreeWidgetItem::text(int column) const
void QTreeWidgetItem::setText(int column, const QString &text)
  •  获取和添加子节点
//添加和获取子节点
QTreeWidgetItem *QTreeWidgetItem::takeChild(int index)
void QTreeWidgetItem::addChild(QTreeWidgetItem *child)
  •  通过构造函数直接指定其父节点
QTreeWidgetItem(QTreeWidgetItem *parent, int type = Type)
QTreeWidgetItem(QTreeWidgetItem *parent, const QStringList &strings, int type = Type)
  •  通过构造函数直接指定所在树控件
QTreeWidgetItem(QTreeWidget *parent, int type = Type)
QTreeWidgetItem(QTreeWidget *parent, const QStringList &strings, int type = Type)
  •  插入子节点
//插在第几个子节点的前面
void QTreeWidgetItem::insertChild(int index, QTreeWidgetItem *child)
  •  通过构造函数直接指定插在哪个父节点的子节点前面
//插在parent节点的preceding子节点的前面
QTreeWidgetItem(QTreeWidgetItem *parent, QTreeWidgetItem *preceding, int type = Type)
  •  通过构造函数直接指定插在哪个树控件的顶级条目的前面
//插在parent树控件的preceding条目之前
QTreeWidgetItem(QTreeWidget *parent, QTreeWidgetItem *preceding, int type = Type)
  • 设置图标
//可以给每一列都设置图标
void QTreeWidgetItem::setIcon(int column, const QIcon &icon)
  •  获取子节点和子节点的数量
//根据索引获取子节点
QTreeWidgetItem *QTreeWidgetItem::child(int index) const

//获取子节点的数量
int QTreeWidgetItem::childCount() const
  •  获取父节点
QTreeWidgetItem *QTreeWidgetItem::parent() const
  • 获取所在树控件
QTreeWidget *QTreeWidgetItem::treeWidget() const

设置标题栏

  • 方法1:调用QTreeWidget的方法
//设置标题,一次性可以设置多列
void QTreeWidget::setHeaderLabels(const QStringList &labels)

//举例:
tree->setHeaderLabels({"编号","内容"});
  • 方法二:先设置一个空的标题栏,再获取到其标题栏对象(标题栏也是QTreeWidgetItem类),调用QTreeWidgetItem的方法
//设置标题栏的条目
void QTreeWidget::setHeaderItem(QTreeWidgetItem *item)
//获取标题栏
QTreeWidgetItem *QTreeWidget::headerItem() const

//QTreeWidgetItem设置文本
void QTreeWidgetItem::setText(int column, const QString &text)


//举例:
tree->setHeaderItem(new QTreeWidgetItem());//设置一个空的标题栏
tree->headerItem()->setText(0,"编号");//设置标题栏第1列的文本
tree->headerItem()->setText(1,"内容");//设置标题栏第2列的文本
//还可以继续添加

新增条目

  •  方法1:addTopLevelItem接口
//新增顶级条目
void QTreeWidget::addTopLevelItem(QTreeWidgetItem *item)


//举例:
//1、先创建条目
//新增条目
QTreeWidgetItem* item_1=new QTreeWidgetItem();
item_1->setText(0,"1");
item_1->setText(1,"清华大学");
//添加子节点
QTreeWidgetItem* item_11=new QTreeWidgetItem();
item_11->setText(0,"1001");
item_11->setText(1,"计算机学院");
item_1->addChild(item_11);
QTreeWidgetItem* item_12=new QTreeWidgetItem();
item_12->setText(0,"1002");
item_12->setText(1,"建筑学院");
item_1->addChild(item_12);
//2.添加条目
tree->addTopLevelItem(item_1);
  •  方法2:在QTreeWidgetItem的构造函数中指定父TreeWidget
//QTreeWidgetItem的构造函数中可以指定其所在树控件
QTreeWidgetItem(QTreeWidget *parent, int type = Type)


//举例:
//2.构造函数
QTreeWidgetItem* item_2=new QTreeWidgetItem(tree);
item_2->setText(0,"2");
item_2->setText(1,"北京大学");
//添加子节点
QTreeWidgetItem* item_21=new QTreeWidgetItem(item_2,{"2001","经管学院"});
QTreeWidgetItem* item_22=new QTreeWidgetItem(item_2,{"2002","理学院"});

插入条目

在指定索引处的前面插入顶级条目,如果是头插,那么index为0,如果是尾插,那么index为树控件的顶级条目数(topLevelItemCount()该方法获取)

//在指定索引处的前面插入顶级条目
void QTreeWidget::insertTopLevelItem(int index, QTreeWidgetItem *item)


//举例:
//尾部插入条目
QTreeWidgetItem* item_3=new QTreeWidgetItem({"3","复旦大学"});
QTreeWidgetItem* item_31=new QTreeWidgetItem(item_3,{"3001","文学院"});
QTreeWidgetItem* item_32=new QTreeWidgetItem(item_3,{"3002","外国语学院"});
//头插入:index为0,尾部插入:index为条目count
tree->insertTopLevelItem(tree->topLevelItemCount(),item_3);

 获取顶级条目的数目

int topLevelItemCount() const

获取顶级条目

可以根据索引获取顶级条目

QTreeWidgetItem *QTreeWidget::topLevelItem(int index) const


//举例:临时往第一个顶级条目下面添加子节点
tree->topLevelItem(0)->addChild(new QTreeWidgetItem({"1003","医学院"}));

 

给条目的某一列设置图标

//举例:给第一个顶级条目的第二列添加图标
tree->topLevelItem(0)->setIcon(1,QIcon(":/11.png"));

 

 给条目的某一列设置为控件(比如一个按钮,一个下拉列表)

//参数1:哪个节点
//参数2:哪一列
//参数3:要设置的Widget
void QTreeWidget::setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget)


//举例:将清华大学设置为下拉列表
QComboBox* cbo=new QComboBox(this);
cbo->addItems({"清华大学","清华","大学"});
tree->setItemWidget(tree->topLevelItem(0),1,cbo);

 

设置选中状态

同样地,我们也可以设置选中状态,来实现选中父节点,子节点也被勾选的效果

//获取和设置条目某一列的选中状态
Qt::CheckState QTreeWidgetItem::checkState(int column) const
void QTreeWidgetItem::setCheckState(int column, Qt::CheckState state)


//举例:
        //初始化第一个条目和其子条目为未选中状态
        tree->topLevelItem(0)->setCheckState(0,Qt::Unchecked);
        for(int i=0;i<tree->topLevelItem(0)->childCount();++i)
        {
            tree->topLevelItem(0)->child(i)->setCheckState(0,Qt::Unchecked);
        }
        //绑定条目点击信号
        connect(tree,&QTreeWidget::itemClicked,tree,[=](QTreeWidgetItem* clicked_item,int i){
            //第1列被点击
            if(i==0)
            {
                //如果被点击的是顶层条目
                if(clicked_item->parent()==nullptr)
                {
                    //获取点击后的状态
                    auto check_state=clicked_item->checkState(0);

                    int child_cnt=clicked_item->childCount();
                    for(int i=0;i<child_cnt;++i)
                    {
                        if(check_state==Qt::Checked)
                        {
                            //选中后将他的子节点都选中
                            clicked_item->child(i)->setCheckState(0,Qt::Checked);
                        }
                        else if(check_state==Qt::Unchecked)
                        {
                            //未选中后将他的子节点都不选中
                            clicked_item->child(i)->setCheckState(0,Qt::Unchecked);
                        }

                    }
                }
                else//被点击的是顶层条目的子节点
                {
                    //子节点被选中的个数
                    int checked_cnt=0;

                    //遍历父节点的所有子节点
                    int child_cnt=clicked_item->parent()->childCount();
                    for(int i=0;i<child_cnt;++i)
                    {
                        if(clicked_item->parent()->child(i)->checkState(0)==Qt::Checked)
                        {
                            ++checked_cnt;
                        }
                    }

                    if(checked_cnt==0)
                    {
                        //子节点都没选中,父节点设置为未选中
                        clicked_item->parent()->setCheckState(0,Qt::Unchecked);
                    }
                    else if(checked_cnt==clicked_item->parent()->childCount())
                    {
                        //都选中了,父节点设置为选中
                        clicked_item->parent()->setCheckState(0,Qt::Checked);
                    }
                    else
                    {
                        //部分选中,父节点设置为半选
                        clicked_item->parent()->setCheckState(0,Qt::PartiallyChecked);
                    }
                }
            }
        });

 

获取选中的节点 

能够获取到上面被选中的节点

QList<QTreeWidgetItem *> QTreeWidget::selectedItems() const

常用信号

英文名的意思很清晰了

/*
1、currentItemChanged()
2、itemActivated()
3、itemChanged()
4、itemClicked()
5、itemCollapsed()收起
6、itemDoubleClicked
7、itemEntered
8、itemExpanded展开,展开后动态生成子节点,需要先遍历条目清空原来的子节点
9、itemPressed
*/

常用槽函数

//收缩条目
[slot] void QTreeWidget::collapseItem(const QTreeWidgetItem *item)

//展开条目
[slot] void QTreeWidget::expandItem(const QTreeWidgetItem *item)


//举例:鼠标移到条目上面,展开条目
//需要打开鼠标追踪
tree->setMouseTracking(true);
//绑定进入条目信号
connect(tree,&QTreeWidget::itemEntered,tree,[=](QTreeWidgetItem* item){
     tree->expandItem(item);
});

 样式表

/*
1、行列样式(交替背景行)
setAlternatingRowColors(true);先要打开这个属性
alternate-background-color:
2、条目通常样式、条目被选中、鼠标悬停样式
QTreeWidget::item{}
QTreeWidget::item:hover{}
QTreeWidget::item:select{}
3、条目收缩和展开时图片替换
3.1 QTreeWidget::branch:has-siblings:!adjoins-item {border-image: url(vline.png)}
3.2 QTreeWidget::branch:has-siblings:adjoins-item {border-image:url(branch-more.png)}
3.3 QTreeWidget::branch:!has-children:!has-siblings:adjoins-item{border-image: url(branch-end.png)}
3.4 QTreeWidget::branch:has-children:!has-siblings:closed,QTreeWidget::branch:closed:has-children:has-siblings {border-image:none;image:url(branch-closed.png)}
3.5 QTreeWidget::branch:open:has-children:!has-siblings,QTreeWidget::branch:open:has-children:has-siblings {border-image:none;image:url(branch-open.png)}
4、标题样式
QHeaderView::section{}
*/

说一下3的样式

美工提供这些图

 学习链接:https://github.com/0voice

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

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

相关文章

为什么链表算法题如此亲睐虚拟节点..........

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 相信大家在做算法题的时候&#xff0c;会经常用到虚拟节点这个技巧。但是却不明白它会给我们带来多大的便利&#xff0c;今天我们利用几道算法题来分析一下。 如何使用&#xff1f; 我们定义的链表结构…

封装的线程池

1.首先写一个队列来存&#xff0c;线程 queue.c #ifndef QUEUE_H #define QUEUE_H #include <stdbool.h> #include <stdlib.h> #include <stdio.h> typedef struct Queue {void **arr;int cap;int front;int rear; } Queue; //创建队列 Queue *create_queu…

手动nginx平滑升级

一、下载nginx安装包 wget http://nginx.org/download/nginx-1.24.0.tar.gz 二、解压缩 tar -zxf nginx-1.24.0.tar.gz 三、进入解压缩后文件 3.1 cd /usr/local/nginx/sbin 预编译 进入如下命令 ./configure -prefix/usr/local/nginx --with-http_ssl_module --with…

Rust 与生成式 AI:从语言选择到开发工具的演进

在现代软件开发领域&#xff0c;Rust 语言正在逐步崭露头角&#xff0c;尤其是在高性能和可靠性要求较高的应用场景。与此同时&#xff0c;生成式 AI 的崛起正在重新塑造开发者的工作方式&#xff0c;从代码生成到智能调试&#xff0c;生成式 AI 的应用正成为提升开发效率和质量…

Linux操作系统小项目——实现《进程池》

文章目录 前言&#xff1a;代码实现&#xff1a;原理讲解&#xff1a;细节处理&#xff1a; 前言&#xff1a; 在前面的学习中&#xff0c;我们简单的了解了下进程之间的通信方式&#xff0c;目前我们只能知道父子进程的通信是通过匿名管道的方式进行通信的&#xff0c;这是因…

Linux权限和软件包

前言 今天我们简单的介绍Linux中的两个概念&#xff0c;分别是权限和软件包。Linux中一切皆文件&#xff0c;权限无非就是限制不同的角色对文件的能不能得问题&#xff0c;软件包则是简单介绍一下Linux中安装卸载程序 权限 权限针对的对象是角色&#xff0c;首先我们先来介绍…

阿里云dataworks测试

文章目录 开始查看全局信息查看数据源信息(endpoint与project的信息)查看绑定、解绑钉钉创建、查看AccessKey(Access Key ID与Access Key Secret) 线上开发新建开发节点mysqlpython 本地开发python 程序调度 开始 参考文档&#xff1a;https://help.aliyun.com/zh/ram/user-gu…

新建的SpringBoot项目结构为空的可能问题与解决方案

问题&#xff1a; 如下图&#xff0c;创建一个名为springboot_demo05的SpringBoot项目的时候&#xff0c;发现创建的项目结构为空&#xff0c;没有下一级目录。但是在新窗口新建一个项目的时候没有这个问题。 打开Maven工具发现也没有关联Maven依赖模型 原因排查&#xff1a; …

abc371 f

F - Takahashi in Narrow Road 我们可以发现&#xff0c;每次操作后&#xff0c;对于一段变化后的区间&#xff0c;其变为了一段公差为1的等差数列&#xff0c;所以我们如果把每个值减去对应的下标&#xff0c;那么对应的区间变化后&#xff0c;都为一个相同的值&#xff0c;这…

观诺奖感言:学好数理化,都被AI打趴下!

10月8日&#xff0c;瑞典皇家科学院宣布&#xff0c;将2024年诺贝尔物理学奖授予两位人工智能先驱——约翰霍普菲尔德&#xff08;John Hopfield&#xff09;和杰弗里辛顿&#xff08;Geoffrey Hinton&#xff09;。 在接到瑞典方打来的电话后&#xff0c;Hinton还在反复确认&a…

ssm基于Javaee的影视创作论坛的设计与实现

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 III 第1章 绪论 1 1.1选题动因 1 1.2目的和意义 1 1.3论文结构安排 2 第2章 开发环境与技术 …

刷题 双指针 滑动窗口

面试经典 150 题 - 双指针 125. 验证回文串⭐️ 学会内部字母处理函数的使用 class Solution { public:bool isPalindrome(string s) {int left 0, right s.size() - 1;while (left < right) {// 处理左边字符if (!isalnum(s[left])) {left;continue;}// 处理右边字符if…

2024 kali虚拟机安装教程,分两大步骤,图文讲解(1)

第二步链接&#xff1a; 2024 kali虚拟机安装教程&#xff0c;分两大步骤&#xff0c;图文讲解&#xff08;2&#xff09;-CSDN博客 准备工作 1.kali的iso镜像文件 2.VMware Workstation Pro 虚拟机软件 正式开始 1.创建新的虚拟机&#xff0c;勾选自定义&#xff08;高级…

King3399(ubuntu文件系统)风扇驱动

该文章仅供参考&#xff0c;编写人不对任何实验设备、人员及测量结果负责&#xff01;&#xff01;&#xff01; 0 引言 文章主要介绍King3399&#xff08;ubuntu文件系统&#xff09;风扇控制&#xff08;GPIO&#xff09;&#xff0c;涉及king-rk3399.dts设备树修改&#x…

职场人情世故,你一定要学

职场上工作固然是第一位&#xff0c;但看似平淡的人际关系的经营&#xff0c;是对工作的顺利展开有重要的辅助作用&#xff0c;人来人往&#xff0c;这几条处事你必须要懂&#xff0c;否则职场上升职、加薪会吃亏。 1、 看破不拆穿。 职场上你要活的很通透的人&#xff0c;对什…

从 Reno TCP 到 Scalable TCP,HighSpeed TCP

前文 Scalable TCP 如何优化长肥管道 介绍了 Scalable TCP&#xff0c;但联系另一个类似的算法 HighSpeed TCP(简称 HSTCP)&#xff0c;就会看到一个类似从 Reno TCP 经 BIC 到 CUBIC 的路线&#xff0c;但采用了不同的策略。 Reno TCP 经 BIC 到 CUBIC 路线的核心在于 “在长…

2024年最新(AI绘画)Stable Diffusion4.9下载及安装教程.

软件介绍 Stable Diffusion 是一款在图像生成领域具有重大影响力的软件。 从工作原理上看&#xff0c;它利用深度学习的先进算法&#xff0c;构建起复杂且强大的神经网络架构。其核心在于能够解读用户输入的文本信息&#xff0c;并将这些信息转化为图像的特征与细节。 在使用…

游戏出海:跨境卖家入驻G2A详细操作指南

《黑悟空神话》在海外爆火&#xff0c;游戏出海也成为了众多游戏开发商的热门选择。在这个趋势之下&#xff0c;G2A&#xff0c;这个专注于游戏出海的电商平台&#xff0c;凭借庞大的用户群体&#xff0c;为游戏卖家提供了一个触达全球玩家的绝佳平台。 对于想要拓展海外市场的…

【HTML】制作一个简易图片轮播器

1. 轮播器效果图 1. 正常状态下每 1.5秒 自动轮播下张图片&#xff0c;轮播结束从头开始重复 2. 鼠标悬停时停止轮播&#xff0c;可以选择左右图片切换 2. HTML 结构 文档类型声明&#xff1a;<!DOCTYPE html> 声明文档类型为HTML5。HTML标签&#xff1a;<html lang…

2024 闽盾杯-黑盾赛道WP

CRYPTO 签到题-学会SM https://www.json.cn/encrypt/sm3 题目要求小写所以需要转换一下 或者脚本&#xff1a; import hashlib message "heidun2024" hash_object hashlib.new(sm3) hash_object.update(message.encode(utf-8)) hash_value hash_object.hexdigest(…