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)); }
原神阴阳师游戏性分析手游游戏性对比一是fgo,它让我开始玩并了解二次元游戏,肝得很累但真的看到喜欢的英灵时会很开心,肝也是导致我汽油的原因,那时候我的想法是fgo能出个好看又强度高的中国英灵就好了。所以后来知道有始
国产独立游戏琉隐2021年最后一天上线!玩家仪式感拉满了2021年眼看着就要结束了,大家年初立下的Flag的都完成了吗?如果kingna工作室年初立下了今年一定要上线琉隐的Flag,那么他们可真是踩着点儿给完成了,因为琉隐正好就是在12
原神与幻塔游戏对比不是原神比幻塔在玩法质量上强太多,而是官方宣发的策略,完全忽略了幻塔的优势,彻彻底底为了热度,抛去幻塔自己的特点来的。抛去bug问题抛去最近什么官方CM泄露国内公民身份证这些公关方
英雄联盟手游拥有联盟最恶心的E技能,小法师为什么就是火不起来英雄联盟的控制技能分为很多种,类似于莫甘娜的一技能或者光辉那样的一技能,所造成的效果我们暂且统称为禁锢。亚索的风,石头人的大招所造成的效果我们统称为击飞。当然还有睡眠,压制,强制位
2022年最值得期待的10款射击游戏,在新的一年开启你的射爆之旅2020年开始新冠疫情席卷全球,大家的生活也多多少少的受到了影响,各家游戏公司虽然因为疫情营收获得了增长,但游戏开发工作受到了极大的影响,近两年延期跳票的游戏越来越多,好在不少大作
相信光的存在,游戏王中六大光芒使在游戏王卡片中存在着数之不清的怪兽,而有的怪兽拥有多种形态和衍生卡,今天就为大家介绍一下六只因为相信光,而获得光芒的力量,成为光芒使者的怪兽们。虽然光芒使者是游戏王卡组系列之一,不
又一个老对手pio宣布退役,网友韦神比赛也看一场少一场了?相信关注绝地求生的朋友们一定都得知了一个重磅的消息,那就是在韩国赛区的GENG战队队员pio宣布正式退役,这对于绝地求生来说是一个非常遗憾的消息,关注PUBG比赛的朋友一定都知道p
属于你的权力,为什么要交出去?01hr我们开始今天的话题是求之不得,我好喜欢讲这个话题,因为我特别喜欢像护士一样,一针一针把你们扎醒,让你们拿着碗,在求啊求啊的幻想中醒过来。在讲课之前我先说,有些宝宝问我,我怎
新年一起追光!看草原绝美日出阳光灿烂的日子是幸福的充实的畅怀的如果你问我怎样迎接新年的到来最治愈,去草原看日出吧,一缕希望的暖阳会扫去过去一年的不安。此次,摄影师来到位于内蒙古自治区的金莲川草原,用镜头记录草
CBA三消息广厦队强援来了,杜润旺状态下滑,林书豪令人失望浙江广厦队在全华班的情况下仍旧打出了不错的表现,到目前为止的第二阶段广厦队三胜一负,整体战绩十四胜三负高居联盟第三位,仍旧持续了强势火力。不过广厦队管理层并不满足于现状,他们仍旧在
连续7场首发!昔日国青王牌在恒大爆发,未来有望重返国足由于俱乐部出现资金困难,中超8冠王广州恒大的外教团队和巴西裔归化球员全部离开了球队。中超联赛第二阶段争冠组,广州恒大只能以老队长郑智为代理主教练,带着全华班的阵容出战。不过他们并没