【QT学习七】QTreeWidget
目录
一、QTreeWidget 概述
二、QTreeWidget 的基本使用
2.1、创建 QTreeWidget 控件
2.2、设置 QTreeWidget 的大小和位置
2.3、设置 QTreeWidget 的列数和列标题
2.4、添加节点
2.5、读取节点
2.6、设置节点数据
2.7、自定义节点样式
三、注意事项
四、完整示例
一、QTreeWidget 概述
QTreeWidget是Qt中一个用于显示树形结构数据的控件,它继承自QTreeView,可以显示多列数据和树形结构的层次关系,还提供了许多交互功能。可以支持单选、多选和可编辑的节点,还可以自定义节点的样式和布局。除此之外,QTreeWidget 还支持信号和槽机制,可以方便地处理节点的操作事件,如点击、双击、选择等等。
头文件: #include <QTreeWidget>
qmake: QT += widgets
继承: QTreeView
二、QTreeWidget 的基本使用
2.1、创建 QTreeWidget 控件
使用 QTreeWidget 控件前,首先需要在代码中创建 QTreeWidget 实例。代码如下:
QTreeWidget *tree = new QTreeWidget();
这里创建了一个 QTreeWidget 实例,并将其保存在 tree 指针中。此时,tree 控件还没有设置显示大小和位置,需要设置它们才能正常显示。
2.2、设置 QTreeWidget 的大小和位置
在 Qt 中,可以使用 QWidget::resize() 和 QWidget::move() 函数来设置控件的大小和位置。代码如下:
tree->resize(400, 300); // 设置控件大小为 400 x 300
tree->move(100, 100); // 设置控件在窗口中的位置为 (100, 100)
这里设置了 tree 控件的大小为 400 x 300 像素,并将其移动到窗口的 (100, 100) 像素处。
2.3、设置 QTreeWidget 的列数和列标题
QTreeWidget 可以显示多列数据,可以使用 QTreeWidget::setColumnCount() 和 QTreeWidget::setHeaderLabels() 函数来设置列数和列标题。代码如下:
tree->setColumnCount(2); // 设置列数为 2
tree->setHeaderLabels({"Name", "Value"}); // 设置列标题为 "Name" 和 "Value"
这里设置了 tree 控件的列数为 2,列标题分别为 "Name" 和 "Value"。
2.4、添加节点
QTreeWidget 中的每个节点都是一个 QTreeWidgetItem 实例,可以使用 QTreeWidget::addTopLevelItem()、QTreeWidgetItem::addChild() 和 QTreeWidget::insertTopLevelItem() 函数来添加节点。代码如下:
QTreeWidgetItem *root = new QTreeWidgetItem(tree); // 创建一个根节点
root->setText(0, "Root"); // 设置节点文本
root->setText(1, "0"); // 设置节点文本
tree->addTopLevelItem(root); // 将节点添加到 QTreeWidget 中QTreeWidgetItem *child1 = new QTreeWidgetItem(root); // 创建一个子节点
child1->setText(0, "Child 1"); // 设置节点文本
child1->setText(1,"10"); // 设置节点文本
root->addChild(child1); // 将节点添加到根节点下QTreeWidgetItem *child2 = new QTreeWidgetItem(root); // 创建另一个子节点
child2->setText(0, "Child 2"); // 设置节点文本
child2->setText(1, "20"); // 设置节点文本
tree->insertTopLevelItem(0, child2); // 将节点插入到 QTreeWidget 的第一个位置
这里创建了一个根节点 root,其文本为 "Root" 和 "0",并将其添加到 QTreeWidget 中。然后创建了两个子节点 child1 和 child2,分别作为 root 的子节点,并设置其文本。注意,要将子节点添加到父节点中,可以使用 QTreeWidgetItem::addChild() 函数或 QTreeWidget::insertTopLevelItem() 函数。
2.5、读取节点
可以使用 QTreeWidget::topLevelItem() 和 QTreeWidgetItem::child() 函数来读取节点。代码如下:
QTreeWidgetItem *item = tree->topLevelItem(0); // 获取第一个根节点
if (item) {QString text1 = item->text(0); // 获取节点的第一列文本QString text2 = item->text(1); // 获取节点的第二列文本qDebug() << text1 << text2; // 输出节点文本QTreeWidgetItem *child = item->child(0); // 获取根节点的第一个子节点if (child) {QString text3 = child->text(0); // 获取子节点的第一列文本QString text4 = child->text(1); // 获取子节点的第二列文本qDebug() << text3 << text4; // 输出子节点文本}
}
这里先获取了 QTreeWidget 的第一个根节点,并输出其文本。然后获取根节点的第一个子节点,并输出其文本。
2.6、设置节点数据
QTreeWidgetItem 可以存储自定义数据,可以使用 QTreeWidgetItem::setData() 函数来设置节点的数据。代码如下:
QTreeWidgetItem *item = tree->topLevelItem(0); // 获取第一个根节点
if (item) {item->setData(2, Qt::UserRole, "custom data"); // 设置第三列的自定义数据
}
// 读取节点数据可以使用item->data(2, Qt::UserRole).toString();
这里设置了根节点的第三列数据为 "custom data"。
2.7、自定义节点样式
QTreeWidget 的节点可以根据需求进行自定义样式的设置。可以使用 QTreeWidget::setItemDelegate() 函数来设置 QItemDelegate,从而实现节点样式的自定义。代码如下:
class MyDelegate : public QItemDelegate
{
public:MyDelegate(QObject *parent = nullptr) : QItemDelegate(parent) {}void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {QStyleOptionViewItem opt = option;if (opt.state & QStyle::State_Selected) {painter->fillRect(opt.rect, opt.palette.highlight());opt.palette.setColor(QPalette::Text, opt.palette.highlightedText().color());}painter->drawText(opt.rect, Qt::AlignVCenter | Qt::AlignLeft | Qt::TextWordWrap, index.data(Qt::DisplayRole).toString());
}
};
// 在创建 QTreeWidget 对象后设置自定义的 QItemDelegate
QTreeWidget *tree = new QTreeWidget(parent);
tree->setItemDelegate(new MyDelegate(tree));
这里定义了一个 MyDelegate 类来继承自 QItemDelegate,重写了其 paint() 函数以实现节点样式的自定义。在创建 QTreeWidget 对象后,使用 QTreeWidget::setItemDelegate() 函数设置自定义的 QItemDelegate。
三、注意事项
1、 QTreeWidget 中的数据存储在 QTreeWidgetItem 中,因此在对 QTreeWidget 进行数据操作时,必须同时对其对应的 QTreeWidgetItem 进行相应的操作。
2、 QTreeWidget 的节点数据的列数默认为 1,可以使用 QTreeWidget::setColumnCount() 函数进行设置。
3、 QTreeWidgetItem 的列数必须与 QTreeWidget 的列数相同,否则节点的数据将无法正确显示。
四、完整示例
#include <QApplication>
#include <QDebug>
#include <QHeaderView>
#include <QItemDelegate>
#include <QPainter>
#include <QTreeWidget>
#include <QTreeWidgetItem>class MyDelegate : public QItemDelegate
{
public:MyDelegate(QObject *parent = nullptr) : QItemDelegate(parent) {}void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {QStyleOptionViewItem opt = option;if (opt.state & QStyle::State_Selected) {painter->fillRect(opt.rect, opt.palette.highlight());opt.palette.setColor(QPalette::Text, opt.palette.highlightedText().color());}painter->drawText(opt.rect, Qt::AlignVCenter | Qt::AlignLeft| Qt::TextWordWrap, index.data(Qt::DisplayRole).toString());}
};int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建 QTreeWidget 对象QTreeWidget *tree = new QTreeWidget;tree->setColumnCount(3); // 设置列数为 3tree->setHeaderLabels({"Name", "Value", "Data"}); // 设置列标签tree->header()->setSectionResizeMode(QHeaderView::ResizeToContents); // 自适应列宽// 创建根节点QTreeWidgetItem *root = new QTreeWidgetItem(tree);root->setText(0, "Root");root->setText(1, "0");root->setData(2, Qt::UserRole, "root data");tree->addTopLevelItem(root);// 创建子节点 1QTreeWidgetItem *child1 = new QTreeWidgetItem(root);child1->setText(0, "Child 1");child1->setText(1, "10");root->addChild(child1);// 创建子节点 2QTreeWidgetItem *child2 = new QTreeWidgetItem(root);child2->setText(0, "Child 2");child2->setText(1, "20");tree->insertTopLevelItem(0, child2);// 设置自定义样式tree->setItemDelegate(new MyDelegate(tree));// 读取节点数据QTreeWidgetItem *item = tree->topLevelItem(0);if (item) {qDebug() << "Root name: " << item->text(0); // 输出 "Root"qDebug() << "Root value: " << item->text(1); // 输出 "0"qDebug() << "Root data: " << item->data(2, Qt::UserRole).toString(); // 输出 "root data"
}// 显示 QTreeWidget 对象
tree->show();return app.exec();
}
运行上述示例程序,可以看到一个简单的 QTreeWidget 对象,其中包含三列数据,根节点下有两个子节点。
相关文章:
【QT学习七】QTreeWidget
目录 一、QTreeWidget 概述 二、QTreeWidget 的基本使用 2.1、创建 QTreeWidget 控件 2.2、设置 QTreeWidget 的大小和位置 2.3、设置 QTreeWidget 的列数和列标题 2.4、添加节点 2.5、读取节点 2.6、设置节点数据 2.7、自定义节点样式 三、注意事项 四、完整示例 一…...

【Linux】组管理和权限管理
目录1 Linux组的基本介绍2 文件/目录所有者2.1 查看文件的所有者2.2 修改文件所有者3 组的创建3.1 基本指令3.2 应用实例4 文件/目录 所在组4.1 查看文件/目录所在组4.2修改文件/目录所在的组5 其他组6 改变用户所在组6.1 改变用户所在的组6.2 应用实例7 权限介绍8 rwx权限详解…...

从零到一发布 NPM 包
如果你负责前端的基础能力建设,发布各种功能/插件包犹如家常便饭,所以熟悉对 npm 包的发布与管理是非常有必要的,故此有了本篇总结文章。本篇文章一方面总结,一方面向社区贡献开箱即用的 npm 开发、编译、发布、调试模板ÿ…...

uniapp国际化配置
1、创建资源文件 创建一个locale文件夹,新增index.js,en.json,zh-hans.json 2.配置locale文件夹中的index.js文件 import Vue from vue import VueI18n from vue-i18n// v8.x import en from ./en.json import zhHans from ./zh-Hans.json import zhHant from .…...

前端中 try-catch 捕获不到哪些异常和常见错误
在开发过程中,我们的目标是 0error,0warning。 但有很多因素并不是我们可控的,为了避免某块代码的错误,影响到其他模块或者整体代码的运行,我们经常会使用try-catch模块来主动捕获一些异常或者错误。 比如我们在获取…...

javaEE 初阶 — 如何构造一个 HTTP 请求
文章目录使用 form 表单标签构造1 构造 GET 请求2 构造 POST 请求使用 ajax 构造1 什么是异步2 代码中如何使用 ajax使用第三方工具构造1 postman 工具的安装2 postman 工具的使用使用 form 表单标签构造 1 构造 GET 请求 使用 form 表单构造 HTTP 请求,需要用到两…...

CentOS 7下安装PostgreSQL 15版本数据库(图文详细)
文章目录CentOS 7下安装PostgreSQL 15版本数据库(图文详细)1 简介1.1 概述1.2 官网2 PostgreSQL安装2.1 选定版本2.2 安装依赖2.3 执行安装2.4 初始化2.5 配置环境变量2.6 创建数据库2.6.1 进入命令行2.6.2 创建DB2.6.3 设置密码2.7 配置远程2.8 测试链接3 pgAdmin4工具安装3.1…...

代码随想录算法训练营第五十一天 | 309. 最佳买卖股票时机含冷冻期、714. 买卖股票的最佳时机含手续费
309. 最佳买卖股票时机含冷冻期 动规五部曲 1、确定dp数组以及下标的含义 dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。 具体可以区分出如下四个状态: 状态一:持有股票状态(今天买入股票,或者是…...

中英文拼写检测纠正开源项目使用入门 word-checker 1.1.0
项目简介 word-checker 本项目用于单词拼写检查。支持英文单词拼写检测,和中文拼写检测。 特性说明 可以迅速判断当前单词是否拼写错误 可以返回最佳匹配结果 可以返回纠正匹配列表,支持指定返回列表的大小 错误提示支持 i18n 支持大小写、全角半角…...

面试如果还不会Netty,看这篇文章就够了
我们去面试的时候,经常被问到netty的题目。我整理了netty的32连问。小伙伴们,收藏起来慢慢看吧。 1. Netty是什么,它的主要特点是什么? Netty是一个高性能、异步事件驱动的网络编程框架,它基于NIO技术实现࿰…...

作为大学生,你还不会搭建chatGPT微应用吗?
目录 引言ChatGPT是什么?背景:ChatGPT敢为人先,打破全球僵局示例演示:基于ChatGPT微应用实现的条件及步骤(1)整体框架(2)搭建前的准备工作(3)实际搭建步骤&a…...

Three.js教程:第一个3D场景
推荐:将NSDT场景编辑器加入你3D工具链其他工具系列:NSDT简石数字孪生下面的代码完整展示了通过three.js引擎创建的一个三维场景,在场景中绘制并渲染了一个立方体的效果,为了大家更好的宏观了解three.js引擎, 尽量使用了…...
lua快速入门~在js基础上,知道Lua 和 Js 的不同即可
☺ lua 和 javaScript 差不多的,就是一些语法的细节不同,学过js,再注意一下下面的细节,就能上手了~ 快速入门,可以直接看一下菜鸟教程的lua:https://www.runoob.com/lua/lua-tutorial.html Lua 和 Js 的不同…...
Linux系统【Centos7】更换源详细教程
更换CentOS 7系统的源可以提高网络速度,加快软件升级和安装的速度。以下是详细的更换CentOS 7源实践。 步骤 1:备份原始 Yum.repo 在更换之前,首先要备份原始 Yum.repo 文件(一定要记得备份)。 bash sudo mv /etc/y…...

金三银四求职季来了!分享几道最常见的app面试题,帮助您更好准备面试求职!
目录:导读 引言 一、Web 端测试和 App 端测试有何不同? 二、App是如何测试的? 三、app闪退的可能原因? 四、给你一个登录页面,你要如何测试? 五、测试过程中遇到app出现crash或者ANR,你会怎么处理? …...

Java集合——List接口学习总结
一、ArrayList实现类 1. 常用方法 增加:add(int index, E element)删除:remove(int index) remove(Object o)修改:set(int index, E element)查看:get(int index)判断:常用遍历方式://List集合 遍历&…...
低代码(三)低代码平台前端技术组件选型1.0(前端)
目前国内主流的低代码开发平台有:金蝶、用友、宜搭、云程、简道云、明道云、氚云、伙伴云、道一云、JEPaaS、华炎魔方、搭搭云、JeecgBoot 、RuoYi等。这些平台各有优劣势,定位也不同,用户可以根据自己需求选择。如果企业想自主可控ÿ…...
代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球
代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球860.柠檬水找零406. 根据身高重建队列452. 用最少数量的箭引爆气球860.柠檬水找零 题目链接:860.柠檬水找零,难度:简单…...
C++整人代码,十分朴实但威力无穷,让你对cout怀疑人生,整死你的同学
cout人人皆知 /a 只是让电脑响个铃 直接上个简单的代码 #include<iostream> using namespace std; int main() {while(1)cout<<"\a"; }最后普及一下: 控制符的作用有: setbase(n) 以n进制方式输出(n8,10,16) setfill(ch) 设置…...

【Spring Cloud Alibaba】12.定时任务(xxl-job)
文章目录简介什么是xxl-job调度中心执行器官方架构图相关地址环境要求配置调度中心下载源码目录说明初始化数据库源码方式docker方式测试集群(可选)配置执行器pom.xmlapplication.propertiesXxlJobExecutorApplication.java执行器组件配置创建定时任务任…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...