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 也是在 …

Mysql和Oracle 数据库操作工具类

适配Mysql和Oracle数据源 文章目录1. 适配Mysql和Oracle数据源2. 适配于Mysql数据源3. 适配Oeacle数据源1. 适配Mysql和Oracle数据源 package cn.stylefeng.guns.generator.core.util; import cn.stylefeng.guns.generator.modular.entity.DatabaseInfo; import lombok.extern…

QString类型转换为bool类型

方法 直接上代码 QString str "12.345";QVariant onLineTemp str;bool isValue onLineTemp.toBool();

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应用程序的开发提供了综合、广泛的…

qt自定义控件的样式

引言 自定义控件创建后&#xff0c;有时需要设置样式&#xff0c;下面记录一下设置样式时需要注意的点。 注意 1.设置自定义控件的样式时&#xff0c;需要下面的代码&#xff1a; void paintEvent(QPaintEvent *event) {Q_UNUSED(event);QStyleOption opt;opt.init(this);Q…

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…

qt中判断文件是否存在

实现 判断一个文件是否存在 bool isExistSpecificFile(QString strPath) {if (QFile::exists(strPath)) {return true;}return false; }注意&#xff1a; 这里的路径strPath是指文件所在的绝对路径&#xff0c;即完整的文件路径。

Docker - 实战TLS加密通讯

使用说明 演示环境(centos7,docker17.06.0-ce) 创建一个文件夹 mkdir /sslcd /ssl创建ca密钥 openssl genrsa -aes256 -out ca-key.pem 4096创建ca证书 openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN*" -out ca.pem创建服务器私钥 open…

qt中拖动窗口widget

提要 继承与QDialog的窗口&#xff0c;窗口原本按住标题栏可以拖动窗口&#xff0c;但是设置了窗口的隐藏标题栏属性后&#xff0c;窗口不再能够拖动。或者继承于QWidget的窗体&#xff0c;不具有窗口拖动功能。 本文实现继承于窗口widget或者继承于QDialog隐藏窗口标题栏的窗…

idea gblfy常用快捷键

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

qt实现窗口拖动的两种思路

提要 窗口按下鼠标不放拖动窗口移动&#xff0c;鼠标释放的时候&#xff0c;停止拖动。这个过程可以用两种方法来实现。 1.鼠标点击后&#xff0c;获取鼠标按下点的坐标和起初窗口左上角的坐标&#xff0c;用鼠标按下点的坐标减去鼠标左上角的坐标&#xff0c;求出这个固定值。…

Linux怎么取消ftp的匿名访问功能

编辑vsftpd.conf: vim /etc/vsftpd/vsftpd.conf修改anonymous_enableYES 为 NO 保存退出 重起服务生效: /etc/init.d/vsftpd restart

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

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

银河麒麟通过命令行安装软件没有安装上

提要 安装软件时出现&#xff1a; nigulasinigulasi-virtual-machine:~$ dpkg -L fcitx-frontend-qt5 | grep .so dpkg-query: 软件包 fcitx-frontend-qt5 没有被安装 使用 dpkg --info ( dpkg-deb --info) 来检测打包好的文件&#xff0c; 还可以通过 dpkg --contents ( dpk…

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

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