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 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 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

#include "ui_QtDemos.h"

#include

#include

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 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 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));

}

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: