【C++/Qt】使用Json脚本动态生成QTabWidget界面

动态生成界面元素

  1. 根据JSON数据中的信息,在运行时动态生成QTabWidget中的选项卡和按钮。
  2. 使用循环遍历JSON数组和对象,创建相应的Qt部件。

流程步骤

  1. 构造数据结构和初始界面
    • 构造 JSON 数据字符串
    • 创建 TabWidgetGenerator 对象,传入 JSON 数据字符串
    • 解析 JSON 数据,获取窗口结构信息
    • 创建 QTabWidget
  2. 遍历工具栏组件
    • 对于每个组件:
      • 创建新的 QWidget 代表一个选项卡
      • 设置选项卡的对象名称
      • 获取当前选项卡的布局信息
      • 根据布局类型创建相应的 QLayout
      • 获取当前选项卡的按钮信息
      • 根据布局类型创建按钮,添加到选项卡的布局中
      • 将创建的布局设置为当前选项卡的布局
      • 将选项卡添加到 QTabWidget 中,设置显示名称
  3. 为窗口创建主布局
    • 将 QTabWidget 添加到垂直布局中
    • 将垂直布局设置为窗口的主布局
  4. 显示窗口
    • 运行 Qt 应用程序
  5. 代码
#include <QApplication>
#include <QWidget>
#include <QTabWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
class TabWidgetGenerator : public QWidget {
public:
    TabWidgetGenerator(const QString& jsonString, QWidget* parent = nullptr)
        : QWidget(parent) {
        // 解析JSON字符串
        QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
        QJsonObject jsonRoot = jsonDoc.object();
        // 创建QTabWidget
        QTabWidget* tabWidget = new QTabWidget(this);
        // 遍历“工具栏”中的组件
        QJsonArray toolbarComponents = jsonRoot["A"].toObject()["components"].toArray();
        for (const QJsonValue& tabNameValue : toolbarComponents) {
            QString tabName = tabNameValue.toString();
            // 创建一个新的选项卡
            QWidget* tab = new QWidget(tabWidget);
            tab->setObjectName(tabName);
            // 获取当前选项卡的组件
            QJsonObject tabComponents = jsonRoot[tabName].toObject();
            QJsonArray buttonArray = tabComponents["components"].toArray();
            // 为当前选项卡创建布局
            QLayout* tabLayout = createLayout(tabComponents["layout"].toString());
            // 为当前选项卡创建按钮
            for (const QJsonValue& buttonValue : buttonArray) {
                QString buttonName = buttonValue.toString();
                QPushButton* button = new QPushButton(buttonName, tab);
                tabLayout->addWidget(button);
            }
            // 为当前选项卡设置布局
            tab->setLayout(tabLayout);
            // 将选项卡添加到tabWidget中
            tabWidget->addTab(tab, tabComponents["showName"].toString());
        }
        // 为窗口创建主布局
        QVBoxLayout* mainLayout = new QVBoxLayout(this);
        mainLayout->addWidget(tabWidget);
        setLayout(mainLayout);
    }
private:
    QLayout* createLayout(const QString& layoutType) {
        if (layoutType == "H") {
            return new QHBoxLayout;
        }
        else if (layoutType == "V") {
            return new QVBoxLayout;
        }
        return nullptr;
    }
};
int main(int argc, char* argv[]) {
    QApplication a(argc, argv);
    // 您的JSON数据
    QString jsonData = R"(
        {
            "A" : {
                "components":["B","C","D"],
                "layout":"H"    
            },
            "B":{
                "components":["btn1","btn2","btn3"],
                "showName":"B",
                "layout":"H"
            },
            "C":{
                "components":["btn4","btn5","btn6"],
                "showName":"C",
                "layout":"H"
            },
            "D":{
                "components":["btn7","btn8","btn9"],
                "showName":"D",
                "layout":"H"
            }
        }
    )";
    TabWidgetGenerator widget(jsonData);
    widget.show();
    return a.exec();
}

生成结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值