QTreeWidget的简单使用

 使用 QTreeWidget 实现复杂树控件功能的详细教程_treewidget 加控件-CSDN博客

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTreeWidget>
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private:Ui::MainWindow *ui;QTreeWidget * treeWidget;
};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);treeWidget = new QTreeWidget;QVBoxLayout *layout = new QVBoxLayout();layout->addWidget(treeWidget);QWidget *centralWidget = new QWidget(this);centralWidget->setLayout(layout);setCentralWidget(centralWidget);treeWidget->setColumnCount(3);QStringList headers;headers << QString("班级")<< QString("分配科目")<< QString("是否达标");treeWidget->setHeaderLabels(headers);QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);item->setText(0, QString("某班级"));item->setCheckState(2, Qt::Unchecked);QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(treeWidget);topLevelItem->setText(0, QString("顶层项目"));treeWidget->addTopLevelItem(topLevelItem);
}MainWindow::~MainWindow()
{delete ui;
}

    QTreeWidgetItem *newTopLevelItem = new QTreeWidgetItem();newTopLevelItem->setText(0, QString("插入顶层项目"));newTopLevelItem->setText(1,"第1列");newTopLevelItem->setText(2,"第2列");treeWidget->insertTopLevelItem(0, newTopLevelItem);

    QTreeWidgetItem *childItem = new QTreeWidgetItem();childItem->setText(0, QString("子项目"));topLevelItem->addChild(childItem);QTreeWidgetItem *childItem1 = new QTreeWidgetItem();childItem1->setText(0, QString("子项目1"));topLevelItem->addChild(childItem1);

    topLevelItem->removeChild(childItem);

    QTreeWidgetItem *removedItem = treeWidget->takeTopLevelItem(0);delete removedItem;

    QTreeWidgetItem *childItem2 = new QTreeWidgetItem();childItem1->setText(1, QString("子项目2"));topLevelItem->addChild(childItem2);

一个demo:

 一个有两种类型的QTreeWidgetItem:节点和名称

可以添加节点,添加名称,删除,修改QTreeWidgetItem的名称

右键弹出菜单

(根据右键的位置:分3种:1.点击节点   2.点击名称 3.点击空白处)

弹出相关的菜单按钮

#ifndef MAINWINDOW1_H
#define MAINWINDOW1_H#include <QMainWindow>
#include <QMenu>
#include <QTreeWidget>
namespace Ui {
class MainWindow1;
}class MainWindow1 : public QMainWindow
{Q_OBJECTenum TreeItemType{none = 0,point = 1,name = 2};
public:explicit MainWindow1(QWidget *parent = 0);~MainWindow1();private slots:void on_actionAddPoint_triggered();void on_actionAddName_triggered();void PopMenu(QPoint);void on_actionDel_triggered();void on_actionChangeItemName_triggered();private:void setActionsState(bool addPoint,bool addName,bool del,bool changeName);void RemoveItem(QTreeWidgetItem *pItem);
protected:private:Ui::MainWindow1 *ui;int mPoint;int mName;QMenu* mMenu;
};#endif // MAINWINDOW1_H
#include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include <QMouseEvent>
#include <QInputDialog>
#include <QDebug>
MainWindow1::MainWindow1(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow1)
{ui->setupUi(this);ui->treeWidget->setHeaderLabel("HeaderLabel");ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);connect(ui->treeWidget,&QTreeWidget::customContextMenuRequested,this,&MainWindow1::PopMenu);mMenu = new QMenu(this);mMenu->addAction(ui->actionAddPoint);mMenu->addAction(ui->actionAddName);mMenu->addAction(ui->actionDel);mMenu->addAction(ui->actionChangeItemName);mPoint = 0;mName = 0;}MainWindow1::~MainWindow1()
{delete ui;
}void MainWindow1::on_actionAddPoint_triggered()
{QTreeWidgetItem *Item = ui->treeWidget->currentItem();if(Item == nullptr){QStringList strList;strList<<QString("节点%1").arg(mPoint);QTreeWidgetItem* pItem = new QTreeWidgetItem(strList);pItem->setData(0,Qt::UserRole+1,TreeItemType::point);ui->treeWidget->addTopLevelItem(pItem);mPoint++;}else{QStringList strList;strList<<QString("节点%1").arg(mPoint);QTreeWidgetItem* pItem = new QTreeWidgetItem(strList);pItem->setData(0,Qt::UserRole+1,TreeItemType::point);Item->addChild(pItem);mPoint++;}
}void MainWindow1::on_actionAddName_triggered()
{QTreeWidgetItem *Item = ui->treeWidget->currentItem();if(Item == nullptr){QStringList strList;strList<<QString("名称%1").arg(mName);QTreeWidgetItem* pItem = new QTreeWidgetItem(strList);pItem->setData(0,Qt::UserRole+1,TreeItemType::name);ui->treeWidget->addTopLevelItem(pItem);mName++;}else{QStringList strList;strList<<QString("名称%1").arg(mName);QTreeWidgetItem* pItem = new QTreeWidgetItem(strList);pItem->setData(0,Qt::UserRole+1,TreeItemType::name);Item->addChild(pItem);mName++;}
}void MainWindow1::PopMenu(QPoint pos)
{QModelIndex index = ui->treeWidget->indexAt(pos);if(!index.isValid()){ui->treeWidget->setCurrentIndex(QModelIndex());}QTreeWidgetItem *pItem = ui->treeWidget->currentItem();if(nullptr == pItem){setActionsState(1,1,0,0);}else{TreeItemType type = (TreeItemType)pItem->data(0,Qt::UserRole+1).toInt();switch (type) {case TreeItemType::point:setActionsState(1,1,1,1);break;case TreeItemType::name:setActionsState(0,0,1,1);break;default:break;}qDebug()<<pItem->text(0).toStdString().c_str();}mMenu->exec(QCursor::pos());
}void MainWindow1::on_actionDel_triggered()
{QTreeWidgetItem *pItem = ui->treeWidget->currentItem();if(nullptr == pItem){}else{RemoveItem(pItem);}
}void MainWindow1::on_actionChangeItemName_triggered()
{QTreeWidgetItem *pItem = ui->treeWidget->currentItem();TreeItemType type = (TreeItemType)pItem->data(0,Qt::UserRole+1).toInt();QString str;switch (type) {case TreeItemType::point:str="节点";break;case TreeItemType::name:str="名称";break;default:break;}QInputDialog dialog;dialog.exec();pItem->setData(0,Qt::DisplayRole,str+dialog.textValue());
}void MainWindow1::setActionsState(bool addPoint, bool addName, bool del, bool changeName)
{ui->actionAddPoint->setVisible(addPoint);ui->actionAddName->setVisible(addName);ui->actionChangeItemName->setVisible(changeName);ui->actionDel->setVisible(del);
}void MainWindow1::RemoveItem(QTreeWidgetItem *pItem)
{int nChildCount = pItem->childCount();if(nChildCount == 0){delete pItem;pItem = nullptr;return ;}for(int i = 0; i < nChildCount; ++i){QTreeWidgetItem *pTmp = pItem->child(0);RemoveItem(pTmp);}delete pItem;pItem = nullptr;
}

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

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

相关文章

阿里巴巴Arthas分析调优JVM实战及常量池详解

目录 一、阿里巴巴Arthas详解 Arthas使用场景 Arthas命令 Arthas使用 二、GC日志详解 如何分析GC日志 CMS G1 GC日志分析工具 三、JVM参数汇总查看命令 四、Class常量池与运行时常量池 字面量 符号引用 五、字符串常量池 字符串常量池的设计思想 三种字符串操作…

freemarker生成pdf,同时pdf插入页脚,以及数据量大时批量处理

最近公司有个需求&#xff0c;就是想根据一个模板生成一个pdf文档&#xff0c;当即我就想到了freemarker这个远古老东西&#xff0c;毕竟freemarker在模板渲染方面还是非常有优势的。 准备依赖&#xff1a; <dependency><groupId>org.springframework.boot</gr…

【IDEA】maven如何进行文件导入,配置并打包

一&#xff0c;介绍、安装 1、maven介绍 maven是一个Java世界中&#xff0c;构建工具。 核心功能&#xff1a; (1) 管理依赖&#xff1a; 管理文件运行的顺序逻辑依赖关系。对配置文件&#xff0c;进行构建和编译。其也是在调用jdk&#xff0c;来进行编译打包工作。 (2) 打…

JavaScript中的原型和原型链

一、原型&#xff1a;每个函数都有prototype属性&#xff0c;称之为原型&#xff0c;这个属性也是个对象所以也称之为原型对象。 1.原型可以放一些属性和方法&#xff0c;供实例对象使用。 <body><script>const arr new Array(1,3,5,7,6)document.getElementByI…

Go语言--延迟调用defer、获取命令行参数、局部变量以及全局变量

延迟调用defer 关键字 defer 用于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行。注意&#xff0c;defer语句只能出现在函数或方法的内部。 defer 语句经常被用于处理成对的操作&#xff0c;如打开、关闭、连接、断开连接、加锁、释放锁。通过defer 机制&#xff0…

NASA——quarius(水瓶座) L3 网格化 1 度年土壤湿度,第 5 版

Aquarius L3 Gridded 1-Degree Annual Soil Moisture V005 水瓶座 L3 网格化 1 度年土壤湿度&#xff0c;第 5 版 简介 该数据集包含美国国家航空航天局&#xff08;NASA&#xff09;科学应用卫星&#xff08;SAC-D&#xff09;上的宝瓶座被动微波辐射计得出的第 3 级网格化…

SLAM 精度评估

SLAM 精度的评估有两个最重要的指标&#xff0c;即绝对轨迹误差&#xff08;ATE&#xff09;和相对位姿误差&#xff08;RPE&#xff09;的 均方根误差&#xff08;RMSE&#xff09;: 绝对轨迹误差:直接计算相机位姿的真实值与 SLAM 系统的估计值之间的差值&#xff0c;首先将…

交换机基本原理

文章目录 前言一、交换机的转发行为二、交换机的转发原理1.MAC地址表2.交换机初始状态3.学习MAC地址4.ARP协议5.交换机转发数据帧6.目标主机回复 三、华为交换机基本命令1.VRP视图分层2.命令行补全3.命令行帮助4.配置设备名称5.命令等级6.用户界面7.配置console认证8.配置用户界…

python-Django项目:图书后台管理系统

具体操作&#xff1a;请参考 Django项目&#xff1a;图书后台管理系统

运维锅总详解计算机缓存

本文从OSI模型中的每一层缓存介绍、常见开源中间件缓存举例、TCP/IP协议栈中的缓存机制、操作系统中的缓存、访问缓存数据的时间范围统计等方面对计算机中的缓存进行详细介绍。希望对您有所帮助&#xff01; 一、OSI模型中的每一层缓存 1. 物理层&#xff08;Physical Layer&…

自动化立体仓库出入库能力及堆垛机节拍

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 自动化立体仓库的出入库能力、堆垛机节拍以…

掌握电路交换与分组交换:计算机网络的核心技术

计算机网络是现代信息社会的基石&#xff0c;而交换技术是实现网络通信的核心。本文将详细介绍两种典型的交换方式&#xff1a;电路交换和分组交换&#xff0c;帮助基础小白快速掌握这两种技术的基本概念和区别。 什么是电路交换&#xff1f; 电路交换&#xff08;Circuit Swi…

Centos系统迁移

目前&#xff0c;CentOS 全系列版本已经于l六月底正式停止维护&#xff0c;这意味着 CentOS 时代彻底终结&#xff0c;也意味着部署在 CentOS 7 上的业务系统将面临前所未有的安全挑战。 本文推荐由红帽衍生出来的且可以做到真正无缝替代的linux版本Open Euler 注&#xff1a…

科普文:Linux服务器性能调优概叙

概叙 Java web应用性能分析之服务端慢和优化概叙_cpu飙高java-CSDN博客 Java web应用性能分析之【CPU飙升分析概述】_web页面性能分析cpu占满是因为死循环,还是循环过多-CSDN博客 在我们的软件服务中&#xff0c;软件部署的服务器&#xff0c;一般都是linux服务器&#xff0c…

rtsp地址 + 测试网站 + java(免环境、免插件、零编码转换http播放)

目录 1、创建rtsp网站 2、测试rtsp网站 3、Java实现rtsp播放 ①maven添加依赖 ②访问http地址即可展示视频内容 1、创建rtsp网站 填写邮箱即可获得两个可用的rtsp网站&#xff08;每月可免费用2G&#xff09;&#xff1a; https://rtsp.stream/ 2、测试rtsp网站 测试网络…

基于SpringBoot的地方废物回收机构管理系统

本系统主要包括管理员和员工两个角色组成&#xff1b;主要包括&#xff1a;首页、个人中心、员工管理、员工请假管理、销假申请管理、工作日志管理、员工工资管理、员工任务管理、任务汇报管理、设备信息管理、设备借用管理、设备归还管理、设备保修管理、维修入库管理、员工打…

Python酷库之旅-第三方库Pandas(002)

目录 一、用法精讲 1、pandas.read_pickle函数 1-1、语法 1-2、参数 1-3、功能 1-4、返回值 1-5、说明 1-6、用法 1-6-1、代码示例 1-6-2、结果输出 2、pandas.DataFrame.to_pickle方法 2-1、语法 2-2、参数 2-3、功能 2-4、返回值 2-5、说明 2-5-1、文件路径…

数据结构(3.8)——栈的应用

栈在括号匹配中的应用 流程图 代码 #include <stdio.h> #include <stdlib.h> #define MaxSize 10typedef struct {char data[MaxSize];int top; } SqStack;// 初始化栈 void InitStack(SqStack* S) {S->top -1; // 初始化栈顶指针 }// 判空 bool StackEmpty(…

《米小圈日记魔法》边看边学,轻松掌握写日记的魔法!

在当今充满数字化娱乐和信息快速变迁的时代&#xff0c;如何创新引导孩子们学习&#xff0c;特别是如何培养他们的写作能力&#xff0c;一直是家长和教育者们关注的焦点。今天就向大家推荐一部寓教于乐的动画片《米小圈日记魔法》&#xff0c;该系列动画通过其独特的故事情节和…