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