QTreeWidget的简单使用

news/2024/7/8 3:55:40 标签: 命令模式

 使用 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.niftyadmin.cn/n/5536404.html

相关文章

前端面试8

基础知识 解释一下什么是跨域问题&#xff0c;以及如何解决&#xff1f; 跨域问题是由于浏览器的同源策略限制了从一个源加载的网页脚本访问另一个源的数据。解决方法包括使用JSONP、CORS&#xff08;跨源资源共享&#xff09;、设置代理服务器等。 描述一下事件冒泡和事件捕获…

用Python读取Word文件并提取标题

前言 在日常工作中&#xff0c;我们经常需要处理Word文档&#xff0c;特别是从中提取关键信息&#xff0c;如标题、段落等。今天&#xff0c;我们将利用Python来实现这一功能&#xff0c;并为大家提供一段完整的代码示例。 准备工作 首先&#xff0c;你需要安装python-docx库…

如何选择快手矩阵系统:打造高效短视频营销的指南

快手作为中国领先的短视频社交平台&#xff0c;为内容创作者和品牌提供了广阔的展示舞台。为了更高效地管理和扩展在快手上的影响力&#xff0c;快手矩阵系统成为了一个重要的工具。本文将指导您如何选择一个合适的快手矩阵系统&#xff0c;以优化您的内容管理和营销策略。 快…

2-1 概率论基础讲解

2-1 概率论基础讲解 主目录点这里 概率论是集中研究概率和随机现象的数学分支&#xff0c;是研究随机性或不确定性等现象的学科。主要研究对象是随机事件、随机变量、随机过程。 基本概念 随机概念 随机实验&#xff1a;对自然现象进行的一次观察或一次科学实验 基本事件&…

在window上搭建docker

1、打开Hyper-V安装 在地址栏输入控制面板&#xff0c;然后回车 勾选Hyper-V安装&#xff0c;如果没有找到Hyper-V&#xff0c;那么请走第2步 2、如果没有Hyper-V(可选&#xff09;第一步无法打开 家庭版本需要开启Hyper-V 创建一个文本文档&#xff0c;后缀名称为.bat.名称…

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

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

理解 React 中的 API 封装、自定义 Hooks、组件、独立模块与 Context

在现代前端开发中&#xff0c;React 提供了多种方法来组织和管理代码。这些方法包括 API 封装、自定义 Hooks、组件、独立模块和 Context。理解它们的区别和联系&#xff0c;可以帮助我们编写更清晰、更模块化的代码。 1. API 封装 目的&#xff1a;处理与后端服务的通信逻辑…

状态模式在金融业务中的应用及其框架实现

引言 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许对象在内部状态改变时改变其行为。状态模式通过将状态的相关行为分离到独立的状态类中&#xff0c;使得状态转换更加明确和简洁。在金融业务中&#xff0c;状态模式可以用于实现交易状…