文章目录

  • 一、QTreeView操作示例图
    • 1.节点的添加删除示例图
    • 2.节点的值的获取与修改
  • 二、QTreeView(个人理解)
  • 三、源码
    • CMainWindow.h
    • CMainWindow.cpp
  • 四、拓展:上级节点的获取与判断
  • 总结
  • 相关文章

一、QTreeView操作示例图

1.节点的添加删除示例图

下图为节点添加删除示例图,其中包含添加顶级节点、添加子节点、移除节点等操作;源码在本文第三节(源码含详细注释)。

2.节点的值的获取与修改

下图为节点对节点值的操作,其中包含获取值、设置值等;源码在本文第三节(源码含详细注释)。

提示:不会使用Qt设计师设计界面的小伙伴点击这里

二、QTreeView(个人理解)

这里我们将QTreeView和QTableView对比一下

  1. 二者都是类似MVC(Model View Controller)模式,其中都包含Delegate,请查看Qt代理的实现(按钮篇)、Qt代理的实现(常规控件篇);
  2. 二者都使用QStandardItemModel存放数据;
  3. QTreeView也存在一个继承其QTreeWidget的子类;
  4. QTreeView会唯一不同的是会操作item的子节点。

三、源码

CMainWindow.h

#ifndef CMAINWINDOW_H
#define CMAINWINDOW_H#include <QMainWindow>
#include <QStandardItemModel>       //数据模型类namespace Ui {class CMainWindow;
}class CMainWindow : public QMainWindow
{Q_OBJECTpublic:explicit CMainWindow(QWidget *parent = 0);~CMainWindow();private slots:/*** @brief on_getCurNodeDataBtn_clicked 获取当前节点值*/void on_getCurNodeDataBtn_clicked();/*** @brief on_setCurNodeDataBtn_clicked 设置当前节点值*/void on_setCurNodeDataBtn_clicked();/*** @brief on_addTopNodeBtn_clicked 添加顶级节点*/void on_addTopNodeBtn_clicked();/*** @brief on_addChildNodeBtn_clicked 添加子节点*/void on_addChildNodeBtn_clicked();/*** @brief on_removeCurNodeBtn_clicked 移除当前节点*/void on_removeCurNodeBtn_clicked();private:Ui::CMainWindow     *ui;QStandardItemModel  *m_pModel;      //数据模型对象指针
};

CMainWindow.cpp

#include "CMainWindow.h"
#include "ui_CMainWindow.h"CMainWindow::CMainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::CMainWindow)
{ui->setupUi(this);//设置窗口标题this->setWindowTitle("QTreeView的简单使用");//===============数据模型(QStandardItemModel)===============//建立数据模型对象空间并指定父对象m_pModel = new QStandardItemModel(ui->treeView);//将数据模型设置到树形视图上ui->treeView->setModel(m_pModel);//设置水平表头列平均分ui->treeView->header()->setSectionResizeMode(QHeaderView::Stretch);//添加列标题m_pModel->setHorizontalHeaderLabels(QStringList() << "one" << "two");}CMainWindow::~CMainWindow()
{//! 析构函数://! 有些小伙伴会发现我没有析构model对象,//! 那是因为我在获取对象空间的时候指定了父对象,//! 当其父对象析构时,会先析构其子对象为指针的对象。delete ui;
}void CMainWindow::on_getCurNodeDataBtn_clicked()
{//获取当前行列QModelIndex curIndex = ui->treeView->currentIndex();int row = curIndex.row();int column = curIndex.column();//当前位置包含-1值返回if( -1 == row || -1 == column){return;}///不获取item的情况////// 仅需要获取文本时使用//! 通过index获取值,默认的data获取的是Qt::DisplayRole的值,//! 通常来说拿到的值就是显示的值ui->valueEdit->setText(curIndex.data().toString());}void CMainWindow::on_setCurNodeDataBtn_clicked()
{//获取当前行列QModelIndex curIndex = ui->treeView->currentIndex();int row = curIndex.row();int column = curIndex.column();//当前位置包含-1值返回if( -1 == row || -1 == column){return;}///需要获取item的情况////// \brief curItem 当需要拿到具体item/位置时使用/// 比如设置item值QStandardItem *curItem;int parentRow = curIndex.data(Qt::UserRole + 1).toInt();//判断顶级节点值选择相应操作if(-1 == parentRow){curItem = m_pModel->item(row, column);}else{//获取当前位置的顶级节点QStandardItem *parentItem = m_pModel->item(parentRow);//通过顶级节点获取子节点curItem = parentItem->child(row, column);}//获取值编辑框中的值并设置到item上curItem->setText(ui->valueEdit->text());
}void CMainWindow::on_addTopNodeBtn_clicked()
{int index = m_pModel->rowCount();QList<QStandardItem *> topList;//链表容器添加顶级节点topList << new QStandardItem(QString("顶级节点:%1-1").arg(index + 1))<< new QStandardItem(QString("顶级节点:%1-2").arg(index + 1));//! 设置Qt::UserRole + n: 用户自定义值//! 当n值不同时,相当于不同的键值,同理不同键则可设置不同值//! 此处设置data是为了获取顶级节点值,通过该值判断和做出对应的操作topList[0]->setData(-1, Qt::UserRole + 1); //设置父节点行,当值为-1时则当前为顶级节点topList[1]->setData(-1, Qt::UserRole + 1);//添加顶级节点m_pModel->appendRow(topList);
}void CMainWindow::on_addChildNodeBtn_clicked()
{//获取当前行列QModelIndex curIndex = ui->treeView->currentIndex();int row = curIndex.row();int column = curIndex.column();int parentRow = curIndex.data(Qt::UserRole + 1).toInt();//当前行列值包含-1值或当前节点非顶级节点时返回if( -1 == row || -1 == column || -1 != parentRow){return;}//获取指定行的首个itemQStandardItem *curTopItem = m_pModel->item(row);//为顶级节点添加子节点QList<QStandardItem *> childList;childList << new QStandardItem(QString("子节点:%1-1").arg(curTopItem->rowCount()))<< new QStandardItem(QString("子节点:%1-2").arg(curTopItem->rowCount()));//设置item的datachildList[0]->setData(row, Qt::UserRole + 1);childList[1]->setData(row, Qt::UserRole + 1);//添加子节点curTopItem->appendRow(childList);
}void CMainWindow::on_removeCurNodeBtn_clicked()
{//获取当前行列QModelIndex curIndex = ui->treeView->currentIndex();int row = curIndex.row();int column = curIndex.column();//当前行列值包含-1值或当前节点非顶级节点时返回if( -1 == row || -1 == column){return;}int parentRow = curIndex.data(Qt::UserRole + 1).toInt();//判断顶级节点值选择相应的移除操作if(-1 == parentRow){m_pModel->removeRow(row);}else{//移除某个子节点需要找到其顶级节点QStandardItem *parentItem = m_pModel->item(parentRow);parentItem->removeRow(row);}}

四、拓展:上级节点的获取与判断

本文对于节点的判断是通过data设置用户定义值操作的,还有一种方法,是通过获取当前位置的QModelIndex对象获取其父对象的QModelIndex判断,代码如下(下方代码仅适用于本文):
提示:据说以下方法不严谨,如手动指定父类对象时。

void CMainWindow::parentIndex()
{//获取当前节点的QModelIndex对象QModelIndex index = ui->treeView->currentIndex();//获取当前节点父对象的QModelIndex对象QModelIndex parentIndex = index.parent();//判断其父节点的行列值,顶级节点的父节点行列值为-1if(-1 == parentIndex.row() || -1 == parentIndex.column()){qDebug() << "当前节点为顶级节点";}else{qDebug() << "当前节点为子节点";}}

总结

QTreeView在判断节点位置时需要注意,并且要设置子节点需要线拿到其父节点才行;每个子节点只有通过其父节点行位置为0的item才可设置;QTreeView设置代理的方式和QTableView一样,需要注意的是,设置的列会贯穿子节点(子节点的对应列同样会生效)。
又是一周,明天继续搬砖了,加油!

相关文章

Qt之QTableView的简单使用(含源码+注释)
Qt之QListView的简单使用(含源码+注释)
Qt代理的实现(按钮篇,含源码+注释)
Qt代理的实现(常规控件篇,含源码+注释)
Qt之QTableView设置多列表头复选框(自定义QHeaderView)、单元格复选框(含源码+注释)
Qt之QSortFilterProxyModel的简单使用(QTableView搜索功能,含源码+注释)

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

Qt之QTreeView的简单使用(含源码+注释)相关推荐

  1. Qt之语言家的简单使用(一)(Qt翻译UI,Qt Linguist的使用,含源码+注释)

    文章目录 一.翻译程序示例图 二.流程须知(个人理解) 三.关于对话框中QDialogButtonBox翻译的操作 四.源码 CLinguistTest.h CLinguistTest.cpp CLi ...

  2. Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)

    文章目录 一.操作示例 1.1 修改记录(数据) 1.2 添加记录(数据) 1.3 删除记录(数据) 1.4 取消操作 1.5 排序操作 1.6 查询操作 二.了解QSqlTableModel 三.源 ...

  3. Qt之天气预报——界面优化篇(含源码+注释)

    一.界面优化效果 下方为界面优化完成和优化前的效果对比. 优化前: 优化后: 二.优化内容 添加标题栏 添加图片(图图标素材源自阿里巴巴矢量图标库) 更新UI内容(微调大小.布局比例) 添加鼠标事件函 ...

  4. Qt之超简单的TCP通信(自定义TCP通信类,含源码+注释)

    文章目录 一.TCP通信示例图 二.TCP使用前的准备 三.自定义TCP通信类的两种方法 四.源码(含注释) TCP Server CTcpServer.h CTcpServer.cpp TCP Cl ...

  5. Qt小游戏之数字华容道(百行代码搭雏形,可玩;含源码+注释)

    文章目录 一.数字华容道,样图如下 二.废话少说直接上代码 1.首先是代码文件分析 2.CLabel的源码 3.CMainWindow的源码 4.main文件 总结 一.数字华容道,样图如下 相信大家 ...

  6. 使用Qt作窗口截屏(含源码)

    截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件.介绍的好像有点多余:(,那我们就直接切入正题. QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上 ...

  7. [qt] 高仿360手机助手[含源码]

    [qt] 高仿360手机助手 实现功能如下: 1. 高仿真界面 2. 获取当前手机屏幕,以及可以截图 3. 获取手机短信/通讯录/应用信息/系统应用信息/视频/音乐. demo版地址: http:// ...

  8. python下的orm基本操作(1)--Mysql下的CRUD简单操作(含源码DEMO)

    最近逐渐打算将工作的环境转移到ubuntu下,突然发现对于我来说,这ubuntu对于我这种上上网,收收邮件,写写博客,写写程序的时实在是太合适了,除了刚接触的时候会不怎么完全适应命令行及各种权限管理, ...

  9. 简单音乐播放器html+css+基础vue+含源码,有搜索和播放mv功能,代码可直接复制用。

    题目:html+css+基础vue实现的简单音乐播放器(含源码),有搜索和播放mv功能,代码可直接复制用. 问题描述: 如果vue刚入门,掌握一些基础语法后就可以写一个简单的音乐播放器来练练手~~如果 ...

  10. ONNX MLIR应用示例(含源码链接)

    ONNX MLIR应用示例(含源码链接) 开放式神经网络交换在MLIR中的实现 (http://onnx.ai/onnx-mlir/). Prebuilt Containers 开始使用ONNX-ML ...

最新文章

  1. html不间断滚动图片,Javascript实现图片不间断滚动的代码
  2. kthread_work和kthread_worker机制
  3. 《BeagleBone开发指南》——1.3 BeagleBone硬件
  4. java 工作 日期转换代码,判断是否是当天,然后日期转换
  5. c++整理--虚函数
  6. thinkPhp 3.1.3的验证码无法显示的问题
  7. shell读取php 数组长度,shell数组的定义、数组长度
  8. Linux权限z代表什么,linux用户与权限使用方法
  9. java hdu2011多项式求和
  10. webpack 基本功能和原理
  11. python100例详解-Python字典实现简单的三级菜单(实例讲解)
  12. 读书笔记之inside JVM(5)
  13. C++ STL算法系列5---equal() , mismatch()
  14. 计算机网络电缆是什么,插入Cat的计算机网络电缆和插入路由器的计算机的网络电缆有什么区别?...
  15. 银联手机POS,支付黑科技
  16. CAD arx常用函数
  17. 观天利器-stellarium
  18. 【测试】功能测试用例设计方法总结
  19. imx6 android4.4 Recovery添加从U盘升级功能
  20. 交换机和路由器技术-15-链路聚合

热门文章

  1. windows通过bat批处理命令,快速清理系统垃圾文件,释放硬盘空间
  2. 通俗易懂的AI算法原理
  3. 《中文版PHOTOSHOP.CS3完全自学教程》李金明.李金荣.彩色扫描版.pdf
  4. Unity通过压缩字体减小包体大小
  5. NetBean中添加tomcat时候出现错误
  6. 零基础入门学习汇编语言~基础知识~机器语言与汇编语言的产生及组成
  7. dumpDex脱壳教程
  8. 博弈论 | 三姬分金与囚徒困境
  9. Elasticjob安装与入门
  10. 如何让html 兼容IE和chrome,IE Tab(让Chrome兼容IE)