首页 > 其他分享 >Qt QTreeView简单使用

Qt QTreeView简单使用

时间:2022-12-20 16:24:47浏览次数:33  
标签:Qt QTreeView item ui 简单 new treeView 节点 QStandardItem

QT-QTreeView使用方法

QTreeView: 用于显示树状结构数据,适用于树状结构数据的操作。

一、初始化

​ 利用QStandardlternModel来初始化数据,标准的基于项数据的数据模型类, 每个项数据可以是任何数据类型。

// 初始化model
QStandardItemModel* m_standardItemModel = new QStandardItemModel();

// 使用model设置QTreeView表头
m_standardItemModel->setHorizontalHeaderLabels(QStringList(QStringLiteral("资源"))); 

// TreeView控件载入model
ui.m_treeView->setModel(m_standardItemModel);

// 展开数据
ui.m_treeView->expandAll();

二、节点添加数据

​ 利用QStandardItem创建根节点与子节点的Item,并向内填充数据。数据类型可以为QString等字符,也可以是常规的变量类型。

// 创建根节点,抽象Item,并没有实际数据
QStandardItem* itemRoot = m_standardItemModel->invisibleRootItem();

// 创建并添加Item的第一个子节点
QStandardItem* itemCam = new QStandardItem(QStringLiteral("相机"));
itemRoot->appendRow(itemCam);

// 向第一个子节点itemCam添加子节点数据
QList<QStandardItem*> camList;
camList.append(new QStandardItem("cam1"));
camList.append(new QStandardItem("cam2"));
camList.append(new QStandardItem("cam3"));
itemCam->appendRows(camList);

// 创建并添加Item的第二个子节点
QStandardItem* itemImg = new QStandardItem(QStringLiteral("图片"));
itemRoot->appendRow(itemImg);

// 向第二个子节点itemImg添加子节点数据
QList<QStandardItem*> imgList;
imgList.append(new QStandardItem("img1"));
imgList.append(new QStandardItem("img2"));
imgList.append(new QStandardItem("img3"));
itemImg->appendRows(imgList);

显示如下:

三、QTreeView节点鼠标点击事件

1.1 鼠标单击事件响应类型

1、当我们将鼠标停靠在指定节点内并点击时,我们需要触发鼠标选中的item发生变化,此时会有QModelInex发生变化。

相关参数详解:

参数 功能
QModelIndex& 返回item的row(), colmun()以及父节点
m_treeViewz->selectionModel() 选中当前鼠标单击的TreeView的model item项
&QitemModel::currentChanged 鼠标选择item事件响应
&QItemSelectionModel::currentChanged 跟踪视图中的选定项

代码如下:

// 鼠标左键单击槽函数
void _on_image_tree_currentChanged(const QModelIndex& current, const QModelIndex& previous); 

// 槽函数连接
connect(ui.m_treeView->selectionModel(), &QitemModel::currentChanged, this, &on_image_tree_currentChanged);

// 槽函数
QtDemos::on_image_tree_currentChanged()
{
    // 你的操作:
        // 从索引index里面获得item指针,model是tree的数据model,这里item数据类型为QStandradItemModel*
    QModelIndex index = current.sibling(current.row(), 0);          // 获取当前item的子节点index note:子节点只有一行的情况下
    QStandardItem* item = mTreeViewModel->itemFromIndex(index);     // 根据index获取当前item
    if(item)
    {
        // 处理代码
        // int indexCurrentItem = index.row() 	// 获取item的行号
        // QString text = item->text(); 		// 获取item的文本
        // m_standardItemModel->itemFromIndex(index)->text() // 通过index获取item文本
    }
}

四、其他操作

1、节点设置checkBox

itemCam->setCheckable(true);
itemImg->setCheckable(true);

2、节点添加图标

【note】:只能添加png, jpg等格式文件,无法添加.ico图标文件

itemCam->setIcon(QIcon("C:/Users/admin/Desktop/Alexnet_Structure.png"));

3、节点不可编辑

ui->m_treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);

完整代码:

4、右键菜单

//打开右键菜单属性
ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);

//右键菜单
menu = new QMenu(ui->treeView);
menu->addAction("添加");
menu->addAction("删除");

最终效果

五、完整代码

QtDemos.h
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtDemos.h"
#include <QStandardItemModel>
#include <QMenu>

class QtDemos : public QMainWindow
{
    Q_OBJECT

public:
    QtDemos(QWidget *parent = Q_NULLPTR);

private:
    Ui::QtDemosClass ui;

private slots:
    // QTreeView鼠标左键选中子节点事件响应槽函数
    void _on_m_treeView_current_changed(const QModelIndex& current, const QModelIndex& previous);
    void _on_m_treeView_MenuPopup(const QPoint &pos);
};
QtDemos.cpp
#include "QtDemos.h"
QtDemos::QtDemos(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
        
// 1.初始化model
QStandardItemModel* m_standardItemModel = new QStandardItemModel();

// 2.使用model设置QTreeView表头
m_standardItemModel->setHorizontalHeaderLabels(QStringList(QStringLiteral("资源"))); 

// 3.创建根节点,抽象Item,并没有实际数据
QStandardItem* itemRoot = m_standardItemModel->invisibleRootItem();

// 4.创建并添加Item的第一个子节点
QStandardItem* itemCam = new QStandardItem(QStringLiteral("相机"));
itemRoot->appendRow(itemCam);

// 5.向第一个子节点itemCam添加子节点数据
QList<QStandardItem*> camList;
camList.append(new QStandardItem("cam1"));
camList.append(new QStandardItem("cam2"));
camList.append(new QStandardItem("cam3"));
itemCam->appendRows(camList);

// 6.创建并添加Item的第二个子节点
QStandardItem* itemImg = new QStandardItem(QStringLiteral("图片"));
itemRoot->appendRow(itemImg);

// 7.向第二个子节点itemImg添加子节点数据
QList<QStandardItem*> imgList;
imgList.append(new QStandardItem("img1"));
imgList.append(new QStandardItem("img2"));
imgList.append(new QStandardItem("img3"));
itemImg->appendRows(imgList);

// 8.TreeView控件载入model
ui.m_treeView->setModel(m_standardItemModel);

// 9.展开数据
ui.m_treeView->expandAll();

// 槽函数
connect(ui.m_treeView->selectionModel(), &QItemSelectionModel::currentChanged, this, &QtDemos::_on_m_treeView_current_changed);
connect(ui.m_treeView, &QTreeView::customContextMenuRequested, this, &QtDemos::_on_m_treeView_MenuPopup);

// 其他操作

// 节点设置checkBox
itemCam->setCheckable(true);
itemImg->setCheckable(true);

// 节点设置图标
itemCam->setIcon(QIcon("C:/Users/admin/Desktop/Alexnet_Structure.png"));// 只能添加png, jpg等格式文件,无法添加.ico图标文件

// 节点不可编辑
ui.m_treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);

// 右键菜单
ui.m_treeView->setContextMenuPolicy(Qt::CustomContextMenu);
}

void QtDemos::_on_m_treeView_current_changed(const QModelIndex& current, const QModelIndex& previous)
{
    // 你的操作 ...
    QModelIndex index = current.sibling(current.row(), 0); //子节点只有一行的情况下
}

void QtDemos::_on_m_treeView_MenuPopup(const QPoint& pos)
{
	QMenu* menu = new QMenu(ui.m_treeView);
	menu->addAction(QStringLiteral("添加"));
	menu->addAction(QStringLiteral("删除"));
menu->exec(ui.m_treeView->mapToGlobal(pos));
}

标签:Qt,QTreeView,item,ui,简单,new,treeView,节点,QStandardItem
From: https://www.cnblogs.com/indulge-code/p/16994427.html

相关文章

  • [leetcode]第 3 天 字符串(简单)
    05.替换空格思路由于每次替换从1个字符变成3个字符,使用字符数组可方便地进行替换。classSolution{publicStringreplaceSpace(Strings){StringBuff......
  • qtablewidget 高亮显示某行
    //设定选择行为,按行选择tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选中行的背景色,必须要显示设置,即代码设置或者在ui文件的控件中设置,......
  • 【结果】游戏王简单检索
    完整代码publicstaticvoidmain(String[]args){System.out.println("请您输入想检索的卡码:1-12");System.out.println("1.青眼白龙2.黑魔术师3.太......
  • 腾讯QTA自动化测试框架(Android/ios/Web/后台/云服务)
    QTA是一个跨平台的测试自动化工具,适用于后台、原生或混合型客户端应用的测试。更详细的介绍见下方链接:testerhome上的介绍链接:https://testerhome.com/articles/17946  开......
  • 2022圣诞节手抄报模板怎么高清打印出来?手机在线打印很简单
    2022年圣诞节马上就要到了,有很多中小学生都被英语老师要求画一张圣诞节手抄报,对于比较有画画天赋的人来说,画一张手抄报不是什么难事,但是对于一些不会画画的孩子来说,这就又......
  • Qt进行CSV文件操作
    https://blog.csdn.net/weixin_39935783/article/details/111685444?ops_request_misc=&request_id=&biz_id=102&utm_term=qtcsv文件&utm_medium=distribute.pc_search_r......
  • 【过程】游戏王简单卡牌检索
    通过这样的代码显示我想要的内容aa=newa();while(hao==1){a.a();break;}这个是输入了名字之后会显示的publicvoida(){System.out.println("卡名:青眼白......
  • 【过程】游戏王简单卡检索
    结合前面的内容大概就是这个样子publicclassyxw{publicstaticvoidmain(String[]args){System.out.println("请您输入想检索的卡码:1-12");Sy......
  • pyqt5图书管理系统--8、学生页面设计、借阅状态页面设计和所有书籍页面设计
    本节分为三个部分:学生页面、借阅状态页面和所有书籍查询页面。主要流程:1、学生用户主界面,可以使用借阅书籍、归还书籍、查看借阅状态、查看所有书籍信息。     2、......
  • 【过程】游戏王简单检索
    游戏王的卡牌对我童年有着深刻的影响,所以打算做一个卡牌的检索publicstaticvoidmain(String[]args){System.out.println("请您输入想检索的卡码:1-12");Syst......