qt中创键树形控件QTreeWidget与QStackWidget相绑定
生活随笔
收集整理的這篇文章主要介紹了
qt中创键树形控件QTreeWidget与QStackWidget相绑定
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
引言
實現點擊下拉列表的項對應的跳轉到相應的堆棧窗口,且每個堆棧窗口中都有各自的樹形控件,更換可執行文件所在目錄下的文件data.json后,點擊更新按鈕,可以更新所有堆棧窗口的樹形控件。
效果
示例
下面是實現代碼:
main.cpp
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_Hdialog.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相绑定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cx_Oracle怎么打包,cx_Ora
- 下一篇: 使用gitlab初次上传代码