Qt QTreeView简单使用
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));
}