QTreeWidget的简单使用

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

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTreeWidget>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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_OBJECT

    enum 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.mfbz.cn/a/773485.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发——网络连接,axios第三方库

1. 下载和安装ohpm 为啥要安装ohpm呢&#xff0c;因为axios是第三方库&#xff0c;不是鸿蒙官方提供的&#xff0c;所以不能直接引入 ohmp简介&#xff1a;作为鸿蒙生态三方库的包管理工具&#xff0c;支持OpenHarmony共享包的发布、安装和依赖管理。 链接&#xff1a;ohpm命…

Python函数缺省参数的 “ 坑 ” (与C++对比学习)

我们都知道Python函数的缺省参数可以降低我们调用函数的成本&#xff0c;但是一般我们的缺省参数都是不可变对象&#xff0c;如果是可变对象&#xff0c;我们对其多次调用会发生什么呢&#xff1f; def func(arr[]):arr.append(Hello)print(arr)func() func() func() 这貌似…

不花钱如何让网站启用HTTPS访问

在互联网的世界里&#xff0c;数据安全已经成为了每个网站和用户都不得不面对的问题。近期&#xff0c;网络信息泄露事件频发&#xff0c;让越来越多的网站开始重视起用户数据的安全性&#xff0c;因此启用HTTPS访问成为了一个网站必须要部署的。 HTTPS协议&#xff0c;作为HT…

RestTemplate、MockMVC、Swagger

rest代码风格 硬编码的部分在实际开发中都是会替换成枚举对象 SpringMVC会自动把json格式的post请求转化为对应接收的 对象 响应请求时&#xff0c;也会自动把 对象转化为 json格式的 RestTemplate 浏览器的地址栏只能提供get请求访问后端&#xff0c;如果要使用post方式发送…

免费开源(附代码地址)文生图提示词自动优化,还发现三个小窍门,人大度小满等机构出品!阶跃星辰万亿MoE+多模态大模型矩阵亮相

免费开源(附代码地址)文生图提示词自动优化,还发现三个小窍门,人大度小满等机构出品!阶跃星辰万亿MoE+多模态大模型矩阵亮相。 文生图也有自己的prompt优化工具了。 我们都知道,大模型输出的质量,很大程度上依赖于输入的prompt。尤其在文生图领域,对于prompt格外敏感。…

Python内存优化的实战技巧详解

概要 Python是一种高级编程语言,以其易读性和强大的功能而广受欢迎。然而,由于其动态类型和自动内存管理,Python在处理大量数据或高性能计算时,内存使用效率可能不如一些低级语言。本文将介绍几种Python内存优化的技巧,并提供相应的示例代码,帮助在开发中更高效地管理内…

高职人工智能专业实训课之“生成对抗网络(GAN)”

一、前言 生成对抗网络&#xff08;GAN&#xff09;作为人工智能领域的一项重要技术&#xff0c;已经在图像生成、风格迁移、数据增强等多个领域展现出巨大的潜力和应用价值。为了满足高职院校对GAN专业实训课程的需求&#xff0c;唯众人工智能教学实训凭借其前沿的教育技术平…

Redis深度解析:核心数据类型与键操作全攻略

文章目录 前言redis数据类型string1. 设置单个字符串数据2.设置多个字符串类型的数据3.字符串拼接值4.根据键获取字符串的值5.根据多个键获取多个值6.自增自减7.获取字符串的长度8.比特流操作key操作a.查找键b.设置键值的过期时间c.查看键的有效期d.设置key的有效期e.判断键是否…

使用AES加密数据传输的iOS客户端实现方案

在现代应用开发中&#xff0c;确保数据传输的安全性是至关重要的。本文将介绍如何在iOS客户端中使用AES加密数据传输&#xff0c;并与服务器端保持加密解密的一致性。本文不会包含服务器端代码&#xff0c;但会解释其实现原理。 加密与解密的基本原理 AES&#xff08;Advance…

java+springboot+Mysql“友书”综合书籍平台系统24489-计算机毕业设计项目选题推荐(附源码)

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;“友书”综合书籍平台当然也不能排除在外。“友书”综合书籍平台系统是以实际运用为开发背景&#xff0c;运用软件工程原…

AI产品经理能力模型的重点素质:人文素养和灵魂境界

在AI产品经理的能力模型中&#xff0c;我最想提的差异化关键点&#xff0c;就是“人文素养和灵魂境界”。 1 为什么“人文素养和灵魂境界”非常重要&#xff1f; 一、“人文素养和灵魂境界”如何影响AI产品设计&#xff1f; 例1&#xff1a;面对一个具体的AI场景&#xff0…

NLP入门——前馈词袋分类模型的搭建、训练与预测

模型的搭建 线性层 >>> import torch >>> from torch import nn >>> class DBG(nn.Module): ... def forward(self,x): ... print(x.size()) ... return x ... >>> tmod nn.Sequential(nn.Linear(3,4),DB…

30斤用什么快递便宜?大件物品怎么寄划算省钱?

大学生小李最近因为毕业要搬家&#xff0c;不得不把一堆书籍、衣服和一些生活用品寄回家。作为一个精打细算的“穷学生”&#xff0c;小李可是不愿意在快递费上花冤枉钱的。于是&#xff0c;他开始研究各种寄快递省钱的方法&#xff0c;今天我们就来看看小李是怎么操作的。一、…

基于Wireshark和TiWsPC(Wireshark Packet Converter)的Zigbee抓包

前言 介绍几种Zigbee抓包方式&#xff1a; 1. Ubiqua 使用教程网上非常多也非常清晰&#xff1b; 但是Ubiqua是收费软件&#xff0c;较贵&#xff1b; 我安装过了&#xff0c;费好多事&#xff0c;没安装成功。 2. Killerbee套件 https://github.com/riverloopsec/killerbe…

phpcms 升级php8.3.8

windows 2008 server 不支持php8.3.8,需升级为windows 2012 1.下载php8.3.8 PHP8.3.9 For Windows: Binaries and sources Releases 2.配置php.ini (1.)在php目录下找到php.ini-development文件&#xff0c;把它复制一份&#xff0c;改名为php.ini (2.)修改php安装目录 根…

【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)

文章目录 定义装饰模式的结构 快速入门 | Demo顶层抽象DataSource数据源接⼝具体实现类引入BASE**64**编码装饰器客户端Client 定义 所谓装饰器模式其实就是在原有的功能上做一个增强&#xff01;&#xff01; 换句话说&#xff1a;以前你妈妈揍你的时候用的巴掌&#xff0c;但…

Windows 安装hadoop 3.4

目录 安装 下载 设置环境变量 配置 修改&#xff1a;hadoop-env.cmd 修改&#xff1a;core-sit.xml 修改&#xff1a;hdfs-site.xml 修改&#xff1a;mapred-site.xml 修改&#xff1a;yarn-site.xml 运行 格式化HDFS文件系统 启动&#xff1a;hadoop 启动&#xf…

开源大模型和闭源大模型,打法有何区别?

现阶段&#xff0c;各个公司都有自己的大模型产品&#xff0c;有的甚至不止一个。除了小部分开源外&#xff0c;大部分都选择了闭源。那么&#xff0c;头部开源模型厂商选择开源是出于怎样的初衷和考虑&#xff1f;未来大模型将如何发展&#xff1f;我们来看看本文的分享。 在对…

多态的优点

多态的优点 1、多态的优点1.1 可替换性&#xff08;Substitutability&#xff09;2、可扩充性&#xff08;Extensibility&#xff09; 2、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、多态的优点 在面向对象编程&#xff08;OOP…

滤波算法学习笔记

目录 引言 一、定义 二、分类 三、常见滤波算法 四、应用与优势 五、发展趋势 例程 1. 均值滤波&#xff08;Moving Average Filter&#xff09; 2. 中值滤波&#xff08;Median Filter&#xff09; 3. 高斯滤波&#xff08;Gaussian Filter&#xff09; 4.指数移动…