【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执行器组件配置创建定时任务任…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
