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,一经查实,立即删除!

相关文章

企业实战06:Oracle数据库_约束

Oracle数据库专栏 命令后面可以不加;分号 SQL语句后面一定要加;分号 文章目录约束5-1 Oracle 约束概述5-2 Oracle 非空约束5-3 Oracle 主键约束5-4 Oracle 在修改表时添加主键约束5-5 Oracle 在创建表时添加外键约束&#xff08;上&#xff09;5-6 Oracle 在创建表时设置外键约…

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

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

qt5中QString输出变量的值

概述 QString类中有两种实现输出字符串中含有变量值的方式&#xff0c;这里做下记录。 示例 方法一 使用QString的函数asprintf; int m_age 12; QString::asprintf("年龄是%d",m_age);方法二 使用arg&#xff1b; QString name "lisa"; QString c…

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客户…

qt中QMap与QMultimap用foreach遍历

引言 若只是单独的遍历容器&#xff0c;不修改容器中元素的值&#xff0c;可以使用foreach来实现&#xff0c;比使用迭代器来遍历元素更简洁&#xff0c;使用foreach迭代器是创建了原来容器的副本&#xff0c;所有不能修改容器中数据。下面看两个示例。 示例 示例一 遍历QM…

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

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

QT中将float数转换为QString类型

概述 直接上代码&#xff0c;下面是示例&#xff1a; 示例一 float up 23.45; QString str QString::number(up ,f,2);示例二 float up 23.45; QString str QString::asprintf("%.2f",up);示例三 float up 23.45; QString str; str str.setNum(up,f,2);示…

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

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

Spring4.x集成xfire1.26 问题汇总

WebService专栏之xfire集成异常总览 文章目录一、asm.jar包冲突1.1 问题现象1.2 问题定位&#xff1a;1.3 解决方案&#xff1a;二、 Old 1.x singleton attribute in use2.1 问题现象2.2 问题定位2.3 解决方案&#xff1a;三、Unrecognized xbean element mapping3.1 问题定位…

qt中十进制转换为十六进制和二进制字符串,以及二进制字符串转十进制,十六进制字符串

概述 直接上代码&#xff0c;记录一下&#xff0c;方便日后使用&#xff1a; 示例一 将十进制转换为二进制和十六进制字符串&#xff1b; int num 23; QString str QString::number(num,16);//转换为十六进制 str QString::number(num,2);//转换为二进制示例二 将二进制…

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

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

双因子认证(Two-factor authentication)

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

Spring中,使用工具类无法自动注入service

这个问题我其实遇到很久了&#xff0c;目前解决方案是手动注入service&#xff0c;并且把工具类也手动注入。 场景&#xff1a; 在spring中&#xff0c;我们经常会定义工具类来做一些奇怪的事情&#xff0c;我当前是通过定时任务quarz调度工具类&#xff0c;工具类再调servic…

sizeof与strlen使用中的问题

概述 直接上代码&#xff0c;使用中经常会涉及到sizeof与strlen计算的问题&#xff0c;下面看例子&#xff1a; char *pstr "hello"; char pstr[] "hellonini"; char pstr[6] "hello";上述求sizeof(pstr)的值&#xff0c;分别为&#xff1a…

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

戳蓝字“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;膜拜了技术…

axis2手动设置命名空间targetNamespace

修改services.xml&#xff1a; name &#xff1a;你暴露的接口服务名 targetNamespace 命名空间 <service name"ws" targetNamespace"url" >,添加targetNamespace属性&#xff0c;然后添加标签&#xff1a; <schema schemaNamespace"url&…