qt中创键树形控件QTreeWidget与QStackWidget相绑定

引言

实现点击下拉列表的项对应的跳转到相应的堆栈窗口,且每个堆栈窗口中都有各自的树形控件,更换可执行文件所在目录下的文件data.json后,点击更新按钮,可以更新所有堆栈窗口的树形控件。

效果

在这里插入图片描述
在这里插入图片描述

示例

下面是实现代码:
main.cpp

#include "dialog.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog w;w.show();return a.exec();
}

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QList>
#include <QMap>
#include <QTreeWidget>typedef struct sceneInfo
{QString     name;//场景名QString     id;//场景id
}ST_SCENEINFO;
typedef ST_SCENEINFO stuSceneInfo;typedef QMap<QString,QList<stuSceneInfo>> mapGroupScene;//键-group,值-组下的所有的场景(场景名和id)typedef struct groupScene
{int               sid;//组名(可以为空字符串)mapGroupScene     group;//组下的所有场景的名称
}ST_GROUPSCENE;
typedef ST_GROUPSCENE stuGroupScene;QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACEclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();
private:void initInterface();//初始化界面void initCombox();//初始化下拉列表void initTreeWidget();//初始化树状列表void initStackWidgetHw();//初始化华为堆栈窗口void initStackWidgetTx();//初始化腾讯堆栈窗口void initStackWidgetWy();//初始化网易堆栈窗口void initStackWidgetXm();//初始化小木堆栈窗口void createTreeWidget(mapGroupScene &groupTree,QTreeWidget *widget);//创建树状图void deleteAllTreeItem();//删除所有页的所有树状项QByteArray readJsonFile();//读json文件void parseJson(QByteArray &byteArray);//解析json字符串
private slots:void onCurrentIndexWidget(int index);//选择下拉列表中的项,对应的窗口也改变void on_updateBtn_clicked();//更新树状控件private:Ui::Dialog *ui;QMap<int,stuGroupScene>      m_sceneInfo;//场景信息,键-sid,值-屏组下的组列表};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QTreeWidgetItem>
#include <QDebug>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);QByteArray byteArray = readJsonFile();parseJson(byteArray);initInterface();
}Dialog::~Dialog()
{delete ui;
}void Dialog::initInterface()
{initCombox();initTreeWidget();
}void Dialog::initCombox()
{QStringList strCompany;strCompany<<QStringLiteral("华为")<<QStringLiteral("腾讯")<<QStringLiteral("网易")<<QStringLiteral("小米");ui->comboBox->addItems(strCompany);void (QComboBox:: *currentIndex)(int index) = &QComboBox::currentIndexChanged;connect(ui->comboBox,currentIndex,this,&Dialog::onCurrentIndexWidget);
}void Dialog::initTreeWidget()
{initStackWidgetHw();initStackWidgetTx();initStackWidgetWy();initStackWidgetXm();
}void Dialog::initStackWidgetHw()
{ui->treeWidget->setColumnCount(1);//设置有1列ui->treeWidget->header()->hide();//设置隐藏头QMap<int,stuGroupScene>::iterator it = m_sceneInfo.find(1);if (it != m_sceneInfo.end()) {stuGroupScene hwScene = it.value();mapGroupScene hwGroupTree = hwScene.group;createTreeWidget(hwGroupTree,ui->treeWidget);}
}void Dialog::initStackWidgetTx()
{ui->treeWidget_2->setColumnCount(1);ui->treeWidget_2->header()->hide();QMap<int,stuGroupScene>::iterator it = m_sceneInfo.find(4);if (it != m_sceneInfo.end()) {stuGroupScene txScene = it.value();mapGroupScene txGroupTree = txScene.group;createTreeWidget(txGroupTree,ui->treeWidget_2);}
}void Dialog::initStackWidgetWy()
{ui->treeWidget_3->setColumnCount(1);ui->treeWidget_3->header()->hide();QMap<int,stuGroupScene>::iterator it = m_sceneInfo.find(9);if (it != m_sceneInfo.end()) {stuGroupScene wyScene = it.value();mapGroupScene wyGroupTree = wyScene.group;createTreeWidget(wyGroupTree,ui->treeWidget_3);}
}void Dialog::initStackWidgetXm()
{ui->treeWidget_4->setColumnCount(1);ui->treeWidget_4->header()->hide();QMap<int,stuGroupScene>::iterator it = m_sceneInfo.find(12);if (it != m_sceneInfo.end()) {stuGroupScene xmScene = it.value();mapGroupScene xmGroupTree = xmScene.group;createTreeWidget(xmGroupTree,ui->treeWidget_4);}
}void Dialog::createTreeWidget(mapGroupScene &groupTree,QTreeWidget *widget)
{QMap<QString,QList<stuSceneInfo>>::iterator it;for (it = groupTree.begin(); it != groupTree.end(); ++it) {if (!it.key().isEmpty()) {QTreeWidgetItem *rootItem = new QTreeWidgetItem(widget,QStringList(QString(it.key())));QList<stuSceneInfo> sceneList = it.value();for (int i = 0; i < sceneList.size(); ++i) {stuSceneInfo tempScene = sceneList[i];QTreeWidgetItem *sceneItem = new QTreeWidgetItem(rootItem,QStringList(QString(tempScene.name)));}}else {QList<stuSceneInfo> sceneList = it.value();for (int i = 0; i < sceneList.size(); ++i) {stuSceneInfo tempScene = sceneList[i];QTreeWidgetItem *sceneItem = new QTreeWidgetItem(QStringList(QString(tempScene.name)));widget->addTopLevelItem(sceneItem);}}}
}void Dialog::deleteAllTreeItem()
{ui->treeWidget->clear();ui->treeWidget_2->clear();ui->treeWidget_3->clear();ui->treeWidget_4->clear();
}QByteArray Dialog::readJsonFile()
{QByteArray byteArray;QString strPath = QCoreApplication::applicationDirPath() + "/data.json";QFile file(strPath);if (file.open(QIODevice::ReadOnly)) {byteArray = file.readAll();}else {qDebug()<<QStringLiteral("文件打开失败!");byteArray = "";}return byteArray;
}void Dialog::parseJson(QByteArray &byteArray)
{QJsonParseError parseError;QJsonDocument doc = QJsonDocument::fromJson(byteArray,&parseError);if (!doc.isNull() && parseError.error == QJsonParseError::NoError) {QJsonObject rootObject = doc.object();if (rootObject.value("result").isArray()) {QJsonArray resultArray = rootObject.value("result").toArray();for (int i = 0; i < resultArray.size(); ++i) {QJsonObject sidObject = resultArray[i].toObject();stuGroupScene tempSidGroup;mapGroupScene tempGroupMap;int sid = sidObject.value("sid").toInt();if (sidObject.value("scene").isArray()) {QJsonArray sceneArray = sidObject.value("scene").toArray();for (int j = 0; j < sceneArray.size(); ++j) {QJsonObject sceneObject = sceneArray[j].toObject();QString group = sceneObject.value("group").toString();stuSceneInfo tempScene;tempScene.id = sceneObject.value("id").toString();tempScene.name = sceneObject.value("name").toString();//这段可以简化思路,直接判断map中有没有相应的键,有则改值,无则添加#if 1QMap<QString,QList<stuSceneInfo>>::iterator it = tempGroupMap.find(group);if (it != tempGroupMap.end()) {QList<stuSceneInfo> &tempSceneList = it.value();tempSceneList.append(tempScene);
//                                tempGroupMap.insert(group,tempSceneList);//这步可以不要,虽然要上也没有什么事}else {QList<stuSceneInfo> tempSceneList;tempSceneList.append(tempScene);tempGroupMap.insert(group,tempSceneList);}#endif
#if 0if (tempGroupMap.size() == 0) {QList<stuSceneInfo> tempSceneList;tempSceneList.append(tempScene);tempGroupMap.insert(group,tempSceneList);}else {QMap<QString,QList<stuSceneInfo>>::iterator it = tempGroupMap.find(group);if (it != tempGroupMap.end()) {QList<stuSceneInfo> &tempSceneList = it.value();tempSceneList.append(tempScene);
//                                tempGroupMap.insert(group,tempSceneList);//这步可以不要,虽然要上也没有什么事}else {QList<stuSceneInfo> tempSceneList;tempSceneList.append(tempScene);tempGroupMap.insert(group,tempSceneList);}}#endif}}tempSidGroup.sid = sid;tempSidGroup.group = tempGroupMap;m_sceneInfo.insert(sid,tempSidGroup);}}}
}void Dialog::onCurrentIndexWidget(int index)
{ui->stackedWidget->setCurrentIndex(index);
}void Dialog::on_updateBtn_clicked()
{QByteArray byteArray = readJsonFile();parseJson(byteArray);deleteAllTreeItem();initTreeWidget();
}

dialog.ui
ui文件中的结构
在这里插入图片描述
上述的ui文件中的结构有一部分折叠了,读者可自行研究。以上内容仅供学习时参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么你的年薪只是别人的月薪?你需要技术专家帮你「充电」

戳蓝字“CSDN云计算”关注我们哦&#xff01;2019 年 5 月 26 - 27 日&#xff0c;由中国 IT 社区 CSDN 与数字经济人才发展中心联合主办的第一届 CTA核心技术及应用峰会将在杭州国际博览中心召开。近 500 名开发者将齐聚于此&#xff0c;共同交流探讨机器学习和知识图谱的技术…

IDEA快速 实现 SpringMVC 整合xfire 发布 WebService 服务

文章目录一、idea快速搭建web项目二、xfire 服务方搭建1. pom依赖2. web.xml3. 创建一个entity4. 创建一个接口5. 创建接口实现类6. 在WEB-INF创建一个META-INF的目录7. 在META-INF创建一个xfire的目录8. 在xfire创建一个services.xml的目录二、xfire客户端搭建1. 创建xfire客户…

腾讯面试:一条SQL语句执行得很慢的原因有哪些?

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;帅地转自&#xff1a;苦逼的码农说实话&#xff0c;这个问题可以涉及…

分布式精华问答 | 分布式系统面临哪些挑战?​

布式的处理方式越来越受到业界的青睐——计算机系统正在经历一场前所未有的从集中式向分布式架构的变革。今天&#xff0c;我们就来看看关于分布式的精华问答吧&#xff01;1Q&#xff1a;什么是分布式缓存&#xff1f;A&#xff1a;为了提高性能和响应时间&#xff0c;在应用程…

如何使用「番茄法」高效的写算法题?

戳蓝字“CSDN云计算”关注我们哦&#xff01; 作者&#xff1a;侯振宇转自&#xff1a;五分钟学算法01 目的 持续做算法题的目的仍然是自身能力提升。可以继续细化成三点:保持思维敏捷。非常重要&#xff0c;状态好才能保持对编程的热情。对基础的数据结构、查找和排序保持熟练…

双因子认证(Two-factor authentication)

一、简介 简言之&#xff0c;双因素身份验证&#xff08;也称为“两步验证”&#xff09;是指身份验证涉及两个阶段——通常是除了常规密码&#xff09;之外的某种一次性密码&#xff08;OTP&#xff1a;One-Time Password&#xff09;。网上银行已经使用这种方法很长一段时间了…

从人工智能到云,英特尔开源技术推动软件栈创新

戳蓝字“CSDN云计算”关注我们哦&#xff01;2019年英特尔开源技术峰会&#xff08;OSTS&#xff09; 【CSDN记者现场报道】5月14-16日&#xff0c;英特尔主办一年一度的开源技术峰会&#xff08;OSTS&#xff09;。该峰会源自2004年的一次内部会议&#xff0c;从最初只有几十个…

Axis2搭建WebService服务

使用Axis2搭建WebService服务 文章目录一、服务端部署1.1 在web.xml配置文件中添加映射路径&#xff1a;2. 创建目录及文件3. 新建服务接口4. 新建接口实现类5. 发布服务6. 浏览器测试二、客户端部署2.1 Axis2客户端通用工具类封装(企业版本)2.2 单元测试(命名空间默认)&#x…

c++实现引用计数

概述 当有指针指向同一块内存空间时&#xff0c;计数器加1&#xff0c;没增加一个指向该内存空间的指针&#xff0c;计数器加1&#xff0c;同理&#xff0c;当原本指向该内存空间的指针指向另一块内存&#xff0c;计数器减1&#xff0c;被指向的另一个内存的计数器加1。下面是…

焦虑的 BAT、不安的编程语言,揭秘程序员技术圈生存现状!

戳蓝字“CSDN云计算”关注我们哦&#xff01;【CSDN 编者按】在迭代不休的技术圈中&#xff0c;仅在过去的一个月期间&#xff0c;我们见证了有史以来第一张黑洞照片的诞生&#xff1b;经历了为让人义愤填膺的 996&#xff1b;思考了作为程序员的年龄之槛&#xff1b;膜拜了技术…

5G精华问答 | 除了速度,5G还能带来什么?

从2016年以来&#xff0c;5G热度逐步攀升。作为下一代移动通信网络&#xff0c;如果用一个关键词来形容5G&#xff0c;那就是“快”。5G不仅会极大地改变人们现有的生活和工作方式&#xff0c;提升通信效率&#xff0c;还可以加大很多前沿技术和产品落地的可能性。今天&#xf…

Spring获取JavaBean的xml形式和注解形式

Spring获取JavaBean的xml形式和注解形式 文章目录一、用xml文件方式管理JavaBean1. 创建一个xml配置文件2. 将一个Bean交由spring创建并管理3. 获取Spring上下文&#xff0c;获取bean二、用注解获取Javabean1. 创建一个class配置java文件2. 将一个bean交由Spring创建并管理3. 获…

C++中两个栈实现一个队列

引言 首先看这个标题的时候&#xff0c;需要联想到栈和队列的特点&#xff0c;栈是先进后出&#xff0c;队列是先进先出。假如三个元素1&#xff0c;2&#xff0c;3&#xff0c;将这三个元素依次入栈1后&#xff0c;再将栈1中元素依次出栈放入到栈2中&#xff0c;栈1中只留下最…

Kube-OVN:基于OVN的开源Kubernetes网络实践

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;今天&#xff0c;许多企业开始运行Kubernetes集群&#xff0c;并从中受益。但我们仍然…

IntelliJ IDEA中创建xml文件

1、file—setting&#xff0c;左上角输入template&#xff0c;2、在左侧栏找到File And Code Templates3、中间选中Files4、点击号&#xff0c;添加模板5、输入模板名字&#xff1a;Name:mybatis-cfg.xml &#xff08;name可以自定义&#xff09;6、后缀名extension&#xff1a…

C++冒泡排序

引言 冒泡排序作为排序中一个比较重要的方法&#xff0c;这里做一些简单的记录。 示例 本例中将一组数据2&#xff0c;4&#xff0c;3&#xff0c;8&#xff0c;5按照从小到大的顺序进行冒泡排序。首先说一下&#xff0c;冒泡排序是怎么排序的&#xff1a;将数组中相邻的两个…

阿里云技术专家入选Apache Member;百度Q1财报:营收241亿元;华为面向全球发布AI-Native数据库……...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周二第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

c++选择排序

引言 选择排序就是找出每趟中的最小值或者最大值与对应趟数位置上的数值进行交换&#xff0c;从而排序&#xff0c;具体像序列&#xff1a;2&#xff0c;5&#xff0c;4&#xff0c;3&#xff0c;8若按照从小到大的顺序选择排序&#xff0c;总共5个元素&#xff0c;需要进行5-…

C++快速排序(二)

引言 此文继上一次的c快速排序之后&#xff0c;是时隔一年后的重新领悟。快速排序就是从一列序列中选择一个数作为基数&#xff0c;一般以左边第一个元素为基数&#xff0c;然后定义两个变量left与right,left指向左边第一个元素&#xff0c;与基数指向相同&#xff0c;right指…

如何看待“英特尔是一家软件公司”?

戳蓝字“CSDN云计算”关注我们哦&#xff01;1968年7月&#xff0c;传奇半导体公司仙童的两位共同创办人罗伯特诺伊斯、高登摩尔从仙童请辞&#xff0c;共同创办了以“INTegrated ELectronics&#xff08;集成电子&#xff09;”前缀为名的一家电子公司&#xff0c;这家公司就是…