qt中根据数据解析的结果动态的创建控件并布局

引言

有时候程序中的控件的个数是无法预测的,当程序启动时,根据解析的数据动态的创建n行m列的控件,并为其布局。下面记录一下动态创建控件,并布局。

运行效果

在这里插入图片描述

示例

此示例主要是从json配置文件中读取参数,然后根据参数的个数创建姐买你上的控件并布局。
下面是具体的实现代码:
main.cpp

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

studentscoredialog.h

#ifndef STUDENTSCOREDIALOG_H
#define STUDENTSCOREDIALOG_H/********************************************======功能描述:=======1.根据解析的数据动态创建按钮,并布局,2.数据太多超过显示的窗口的大小时,自动添加滚动条。
********************************************/#include <QDialog>//具体学生成绩结构
typedef struct studentInfo
{QString name;//学生姓名qreal   score;//学生成绩
}ST_STUDENTINFO;
typedef ST_STUDENTINFO stuStudent;
typedef struct scoreInfo
{QString strClass;//班级qreal   arvgScore;//平均成绩qreal   totalScore;//总成绩uint8_t number;//人数QList<stuStudent> students;//学生成绩列表
}ST_SCOREINFO;
typedef ST_SCOREINFO stuScore;class QVBoxLayout;
QT_BEGIN_NAMESPACE
namespace Ui { class StudentScoreDialog; }
QT_END_NAMESPACEclass StudentScoreDialog : public QDialog
{Q_OBJECTpublic:StudentScoreDialog(QWidget *parent = nullptr);~StudentScoreDialog();
protected:QString getExePath();//获取可执行文件的路径void readStudentJsonFile();//读取json文件void parseJsonContent(QByteArray &array);//解析json文件内容void createCtrl();//创建控件void createEveryClassScore(stuScore &score,QVBoxLayout *vLayout);//创建每一个班级的成绩情况
private:Ui::StudentScoreDialog *ui;QList<stuScore>         m_stuScoreList;//保存从json文件读取的变量值
};
#endif // STUDENTSCOREDIALOG_H

studentscoredialog.cpp

#include "studentscoredialog.h"
#include "ui_studentscoredialog.h"
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonParseError>
#include <QFile>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QDebug>StudentScoreDialog::StudentScoreDialog(QWidget *parent): QDialog(parent), ui(new Ui::StudentScoreDialog)
{ui->setupUi(this);setWindowFlags(Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint);readStudentJsonFile();createCtrl();
}StudentScoreDialog::~StudentScoreDialog()
{delete ui;
}QString StudentScoreDialog::getExePath()
{return QCoreApplication::applicationDirPath();
}void StudentScoreDialog::readStudentJsonFile()
{QString strPath = getExePath() + "/students.json";QFile file(strPath);if (file.open(QIODevice::ReadOnly)) {QByteArray byteArray = file.readAll();file.close();parseJsonContent(byteArray);}else {qDebug()<<QStringLiteral("文件打开失败!");}
}void StudentScoreDialog::parseJsonContent(QByteArray &array)
{QJsonParseError parseError;QJsonDocument doc = QJsonDocument::fromJson(array,&parseError);if (!doc.isEmpty() && parseError.error == QJsonParseError::NoError) {QJsonObject rootObject = doc.object();if (rootObject.value("msg").toString() == "score") {QJsonArray resultArray = rootObject.value("results").toArray();for (int i = 0; i < resultArray.size(); ++i) {QJsonObject resultObject = resultArray[i].toObject();stuScore tempScore;tempScore.strClass = resultObject.value("class").toString();tempScore.arvgScore = resultObject.value("averageScore").toDouble();tempScore.totalScore = resultObject.value("totalScore").toDouble();tempScore.number = resultObject.value("number").toInt();QJsonArray studentArray = resultObject.value("students").toArray();for (int j = 0; j < studentArray.size(); ++j) {stuStudent tempStudent;QJsonObject studentObject = studentArray.at(j).toObject();tempStudent.name = studentObject.value("name").toString();tempStudent.score = studentObject.value("score").toDouble();tempScore.students.append(tempStudent);}m_stuScoreList.append(tempScore);}}}
}void StudentScoreDialog::createCtrl()
{QWidget *widget = ui->scrollAreaWidgetContents;QVBoxLayout *vLayout = new QVBoxLayout(widget);vLayout->setSpacing(5);vLayout->setContentsMargins(5,5,5,5);for (int i = 0;  i < m_stuScoreList.size(); ++i) {QGroupBox *groupBox = new QGroupBox;QVBoxLayout *groupVlayout = new QVBoxLayout(groupBox);groupVlayout->setSpacing(5);groupVlayout->setContentsMargins(5,0,5,0);stuScore classScore = m_stuScoreList.at(i);createEveryClassScore(classScore,groupVlayout);vLayout->addWidget(groupBox);}
}void StudentScoreDialog::createEveryClassScore(stuScore &score, QVBoxLayout *vLayout)
{QHBoxLayout *hLayout = new QHBoxLayout;QLabel *classLabel = new QLabel(QStringLiteral("班级:"));QLineEdit *classEdit = new QLineEdit(score.strClass);QLabel *averageLabel = new QLabel(QStringLiteral("平均成绩:"));QLineEdit *averageEdit = new QLineEdit(QString::number(score.arvgScore));QLabel *totalLabel = new QLabel(QStringLiteral("总成绩:"));QLineEdit *totalEdit = new QLineEdit(QString::number(score.totalScore));QLabel *numberLabel = new QLabel(QStringLiteral("人数:"));QLineEdit *numberEdit = new QLineEdit(QString::number(score.number));hLayout->addWidget(classLabel);hLayout->addWidget(classEdit);hLayout->addWidget(averageLabel);hLayout->addWidget(averageEdit);hLayout->addWidget(totalLabel);hLayout->addWidget(totalEdit);hLayout->addWidget(numberLabel);hLayout->addWidget(numberEdit);vLayout->addLayout(hLayout);QHBoxLayout *scoreLayout = nullptr;for (int i = 0; i < score.students.size(); ++i) {if (i % 4 == 0) {scoreLayout = new QHBoxLayout;scoreLayout->setSpacing(5);scoreLayout->setContentsMargins(0,0,0,0);vLayout->addLayout(scoreLayout);}stuStudent tempStudent = score.students[i];QLabel *nameLabel = new QLabel(QStringLiteral("姓名:"));QLineEdit *nameEdit = new QLineEdit(tempStudent.name);nameEdit->setFixedWidth(120);QLabel *scoreLabel = new QLabel(QStringLiteral("成绩:"));QLineEdit *scoreEdit = new QLineEdit(QString::number(tempStudent.score));scoreEdit->setFixedWidth(50);scoreLayout->addWidget(nameLabel);scoreLayout->addWidget(nameEdit);scoreLayout->addWidget(scoreLabel);scoreLayout->addWidget(scoreEdit);if (i == score.students.size() - 1 && score.students.size() % 4 != 0) {scoreLayout->addStretch();}}
}

ui文件中添加的控件:
在这里插入图片描述
创建的项目的结构:
在这里插入图片描述
此项目中读取的配置文件students.json,配置文件的内容如下:
students.json

{"msg":"score","results":[{"class":"二年级一班","averageScore":78,"totalScore":936,"number":12,"students":[{"name":"李明","score":77},{"name":"胡书","score":77},{"name":"扫速度","score":79},{"name":"山山倒","score":80},{"name":"阿萨","score":68},{"name":"维欧","score":77},{"name":"奇数","score":75},{"name":"使能","score":78},{"name":"水浇地","score":69},{"name":"当数据","score":87},{"name":"但是","score":76},{"name":"撒口","score":79}]},{"class":"二年级二班","averageScore":80,"totalScore":960,"number":12,"students":[{"name":"蛋黄酥","score":77},{"name":"随机","score":79},{"name":"奥斯基","score":80},{"name":"赛德克","score":78},{"name":"收到","score":83},{"name":"卡松","score":77},{"name":"欧俄","score":86},{"name":"撒旦","score":78},{"name":"喀什","score":84},{"name":"科奥","score":87},{"name":"杰斯","score":76},{"name":"欧维","score":83}]}]
}

整个工程就如上面所示,程序启动的时候根据从配置文件中获取的参数来创建控件,并布局,上面虽使用了栅格布局,但设置了姓名和成绩的控件的宽度,故而将窗口最大化之后不能很完美的显示控件,即成绩和姓名行编辑器没有被拉伸,注释掉对姓名和成绩行编辑器的宽度设置后可以最大化窗口,同时拉伸控件。

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

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

相关文章

5分钟带你了解Kafka的技术架构 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;大家都知道 Kafka 是一个非常牛逼的消息队列框架&#xff0c;阿里的 RocketMQ 也是在 …

Spark精华问答 | Spark的计算方法是什么?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Spark是一个针对超大数据集合的低延迟的集群分布式计算系统&#xff0c;比MapReducer快40倍左右&#xff0c;是hadoop的升级版本&#xff0c;Hadoop作为第一代产品使用HDFS&#xff0c;第二代加入了Cache来保存中间计算结果&#xf…

qt中创建控件布局以及删除原有布局和控件

引言 当根据数据来创建控件并布局时&#xff0c;如果数据更新&#xff0c;那么之前创建的控件便需要删除后重新创建布局。该文主要说明将原来的布局和控件删除&#xff0c;重新创建并布局。 示例 先看一下ui文件&#xff1a; 下面是实现代码&#xff1a; void StatusViewDi…

Spring精华问答 | Spring 能帮我们做什么?

Spring框架是一个开源的Java平台,它提供了非常容易,非常迅速地开发健壮的Java应用程序的全面的基础设施支持。今天就让我们一起来看看关于Spring的精华问答吧。1Q&#xff1a;什么是Spring框架&#xff1f;A&#xff1a;Spring框架是一个为Java应用程序的开发提供了综合、广泛的…

linux 上传文件 rz命令 提示command not found 解决方法

-bash: rz: command not found rz命令没找到&#xff1f; 执行sz&#xff0c;同样也没找到。 安装lrzsz&#xff1a; yum -y install lrzsz现在就可以正常使用rz、sz命令上传、下载数据了。 使用方法&#xff1a; 上传文件 rz filename下载文件 sz filename

IoT与大数据 如何激发数字营销最大潜能?

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;译者&#xff1a;风车云马 物联网与大数据概述物联网(IOT)简单理解&#xff0c;除了电…

qt中生成含有中文的json文件,读取含有中文的json文件

引言 之前将变量保存并在本地生成json文件&#xff0c;由于其中含有中文&#xff0c;导致生成的json文件出现乱码&#xff0c;或者就是生成的json文件没有乱码&#xff0c;但是读取生成的json文件时出现乱码&#xff0c;不能正常解析json. 示例 运行效果&#xff1a; 下面是…

年初新立Flag,新华三解决方案部做了点儿啥?

戳蓝字“CSDN云计算”关注我们哦&#xff01;极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;人人都提及的数字化时代&#xff0c;企业不想方设法提升效率怎么行&#xff1f…

idea gblfy常用快捷键

gblfy日常快捷键&#xff1a; 关键词说明idea中对应的操作CTRL左方向光标向左跳跃一个单词Editor Actions -> Move Caret to Previous WordCTRL右方向光标向右跳跃一个单词Editor Actions -> Move Caret to Next Wordmianmian方法输入main后按着(自动提示)alt/sout快速打…

看华为生态大学 如何玩转人才生态?

戳蓝字“CSDN云计算”关注我们哦&#xff01;极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;从孔子兴私学开始&#xff0c;千百年来&#xff0c;中国人在私塾中开始或完成自…

Hadoop精华问答 | 关于Hadoop核心技术的精华问答

戳蓝字“CSDN云计算”关注我们哦&#xff01;随着科技时代的发展&#xff0c;大数据与云计算已势不可挡的架势席卷未来&#xff0c;不可否认&#xff0c;大数据时代已经来临&#xff0c;并将深刻地改变着我们的工作和生活。学习大数据技术&#xff0c;是时代的召唤&#xff0c;…

如何将本地代码推送至远程仓库

文章目录一、现在远程仓库创建仓库二、本地操作流程1. 用idea打开项目2. 选择需要打开项目3. 选择这个窗口打开或者用一个新的窗口打开都可以4. 导入成功的项目结构三、将本地仓库的代码推送远程仓库1. 初始化本地git仓库2. 将项目代码提交到暂存区3. 将暂存区的代码提交到本地…

Open Infrastructure Summit 2019,炼就成功开源范示;阿里云居亚太市场第一;高通将获45亿美元和解金...

戳蓝字“CSDN云计算”关注我们哦&#xff01;重磅先知 Open Infrastructure Summit 2019,炼就成功开源范示云计算市场烽烟再起&#xff1a;阿里云位居亚太市场第一高通将从苹果公司获得至少45亿美元和解金重磅快报Open Infrastructure Summit 2019,炼就成功开源范示“开源不是…

以人为本、用“简”驭“繁”……统统都是新华三物联网的关键词儿!

戳蓝字“CSDN云计算”关注我们哦&#xff01;极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;初见2019 Navigate领航者峰会的展区&#xff0c;就被这个接地气的大屏幕吸引了…

我们应聘BAT等互联网公司,关于Spring到底需要掌握什么?

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;阅读本文大概需要 3 分钟。之前分享过一些BAT面试必会的文章&#xff0c;一些读者看了…

java.lang.reflect.InvocationTargetException 的惨痛教训

记录发布webservice漏发内部类文件导致异常java.lang.reflect.InvocationTargetException 的惨痛教训 我的一个实现类中调用了一个内部类&#xff0c;在本地测试正常&#xff0c;发布服务期之后&#xff0c;soapUI共测试报 java.lang.reflect.InvocationTargetException &…

qt下实现文件的拖拽打开

引言 此文用于记录按下鼠标左键不放&#xff0c;拖动文件到程序中打开。该示例中只设置了可以拖动的文件类型为.h,.cpp,.txt这三种文件类型。 程序运行的效果&#xff1a; 示例 下面是具体的实现。 项目的结构&#xff1a; 具体的实现代码&#xff0c;如下&#xff1a; mai…

qt中使用QCompleter实现查找功能

引言 本文有两个例子&#xff0c;示例一中通过在combox中输入文本可以实现自动补全&#xff0c;用户根据提示列表&#xff0c;选中某一个信息&#xff0c;作为要搜索的字符串。示例二中用户输入要搜索的文本在行编辑器中&#xff0c;当输入的文本在搜索的字符串列表中时&#…

动图:程序员才懂的这些!

戳蓝字“CSDN云计算”关注我们哦&#xff01;1. Java VS C2. 功能先上了再说3.高级开发人员作为一个团队进行编程4. 调试CSS5. 编译错误&#xff1a;括号不匹配6.高级开发人员重构代码7. 看实习生编码的时候&#xff0c;我的表情...8.当我尝试进入BIOS9. 虽然很多Bug&#xff0…

表达祝福与喜悦的数字资产——平安夜的特别礼物华为云DAC

平安夜的街灯光闪烁&#xff0c;人们沉浸在节日气氛中&#xff0c;忙着购买礼物&#xff0c;准备晚餐&#xff0c;相互传递感恩与祝愿。华为云DAC数字资产创意平台锁住美好&#xff0c;用数字艺术的形式制作专属节日记忆&#xff0c;有创意的礼物总让人难忘。 独一无二的礼物—…