引言

实现点击下拉列表的项对应的跳转到相应的堆栈窗口,且每个堆栈窗口中都有各自的树形控件,更换可执行文件所在目录下的文件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文件中的结构有一部分折叠了,读者可自行研究。以上内容仅供学习时参考。

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

  1. qt中树形控件QTreeWidget的项点击后获取该项的文本

    概述 通过点击树形控件的项,可以得到被点击的树形控件的文本,使用树形控件的信号itemPressed与所在类的槽函数绑定,通过传递参数QTreeWidgetItem和列column,在绑定的槽函数中得 ...

  2. c#,c++,qt中多线程访问UI控件线程的问题汇总

    c#和MFC中可以创建UI控件及模态/非模态对话框,Qt中只能在主UI线程中创建访问UI控件. c#和MFC中可以通过全局变量或指针句柄等方式在工作线程中访问其他UI线程控件,其中c#需要Invoke ...

  3. QT中常用的输入控件

    Qt Creator有15种Input Widgets,如下图:     Input Widgets的Qt类和名称介绍如下表 控件类     控件名     中文名     控件类     控件名   ...

  4. Qt 中容器类型的控件

    转载:https://subingwen.cn/qt/qt-containers/ 1.QWidget 这个类是所有窗口类的父类,可以作为独立窗口使用,也可以内嵌到其它窗口中使用. Qt 中的所有控件 ...

  5. Qt中鼠标滑过控件由箭头变成手型QWidget::setCusor()

    qt中,当要实现鼠标进入某个控件区域时,鼠标箭头变为手型效果,可以用函数QWidget::setCursor(),其中该函数原型如下所示:(该代码对于任何继承于QWidget的控件都有效,也就是无论是 ...

  6. Qt学习笔记之常用控件QTreeWidget

    一.QTreeWidget Class The QTreeWidget class provides a tree view that uses a predefined tree model. Mo ...

  7. 树形控件Tree Control

    树形控件Tree Control 前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统 ...

  8. VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)

    前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统中是很常见的,例如资源管理器左侧的 ...

  9. Qt --- QTreeWidget 树形控件实例遇到的问题

    文章目录 说明 代码 widget.h widget.c 源码下载 遇到的问题 解决方式1 解决方式2 操作后的显示 说明 环境 Qt软件版本 : 5.9.9 实例参考书籍 : Qt5开发及实例 陆文 ...

最新文章

  1. 别在 Java 代码里乱打日志了,这才是正确的打日志姿势!
  2. python【力扣LeetCode算法题库】219 -存在重复元素 II
  3. applicationContext.xml存放的位置
  4. 科大星云诗社动态20210420
  5. 解决ftp的pasv模式下iptables设置问题
  6. Linux先发送条件变量,浅谈Linux条件变量的使用
  7. 5 压缩上传图片_推荐一个干净纯粹的网站,专注图片压缩、pdf相关操作
  8. 样条之贝塞尔(Bezier)
  9. class没有发布到tomcat_总在说SpringBoot内置了tomcat启动,那它的原理你说的清楚吗?
  10. $PATH环境变量的作用
  11. python删除链表中重复的节点_删除链表中所有值与Python相同的节点的程序
  12. Web报表页面如何传递中文参数
  13. py验证码-联众验证码接入
  14. LENS CRA和SENSOR CRA匹配问题解析
  15. 28天高效突击大礼包:微服务+分布式+框架,java开发spark视频
  16. 如何使用计算机作文600字,计算机比赛作文600字
  17. xbox无线适配器驱动_雷蛇推出两款适用于新 Xbox 的游戏耳机:Kaira、Kaira Pro
  18. 电影推广思路详解,最权威的电影推广方案
  19. 【公众号】高级配色“马卡龙调色板”必须码住!
  20. leaflet maxZoom突破18

热门文章

  1. 深度解析数据湖存储方案Lakehouse架构
  2. RedShift到MaxCompute迁移实践指导
  3. 对话阿里云MVP裔隽跨界半生,不改赤子心
  4. 海纳威上云 构建数字化透明工厂
  5. 2684亿销售额背后的阿里AI技术
  6. 寻找 K8s 1.14 Release 里的“蚌中之珠”
  7. “阿里巴巴小程序繁星计划”:20亿扶持200万小程序开发者和100万商家
  8. Nacos服务发现控制台预览
  9. Gartner:企业机构需重新定义网络安全领导者角色
  10. Python 本身真的没什么用!