引言

有时候程序中的控件的个数是无法预测的,当程序启动时,根据解析的数据动态的创建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}]}]
}

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

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

  1. python 动态调整控件大小_python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例...

    PyQt5动态(可拖动控件大小)布局控件QSplitter简介 PyQt还提供了特殊的布局管理器QSplitter.它可以动态地拖动子控件之间的边界,算是一个动态的布局管理器,QSplitter允许用 ...

  2. pyqt5中控件缩放功能_python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例...

    PyQt5动态(可拖动控件大小)布局控件QSplitter简介 PyQt还提供了特殊的布局管理器QSplitter.它可以动态地拖动子控件之间的边界,算是一个动态的布局管理器,QSplitter允许用 ...

  3. excel中如何动态地创建控件以显示查询结果_年终汇报,Excel图表真难搞?80份可视化图表帮你10秒搞定...

    最近分享了20个EXCEL图表的详细制作方法,这些图表是我在工作中经常用到的,因为工作中要处理大量的数据,常常要做PPT向领导汇报工作,有时接到通知就要汇报了,给我们的只有准备会场和通知参会人员的时间 ...

  4. 【Qt开发笔记】Qt自定义控件开发与使用,自定义控件实现容器与控件内布局

    1.开发环境 Qt版本:Qt 4.8.7 编译器:MinGw 系统:Windows 2.创建Qt4自定义控件 创建一个Qt自定义控件工程. 工程名为Custom. 控件类取名Custom. 然后完成创 ...

  5. excel中如何动态地创建控件以显示查询结果_一起学Excel专业开发02:专家眼中的Excel及其用户...

    学习Excel技术,关注微信公众号: excelperfect 对于大多数人来说,使用Excel来做的工作就是在单元格中输入数据,进行一些格式化制作成报表输出,在这个过程中,可能会使用一些公式,可能会 ...

  6. excel中如何动态地创建控件以显示查询结果_Excel催化剂开源第23波-VSTO开发辅助录入功能...

    在Excel催化剂的几大辅助录入功能中(数据验证保护.数据多级联动输入.关键词模糊智能匹配输入)中,用了一些customxmlPart技术来存储配置信息,同时在关键词模糊智能匹配输入中,用了一个VST ...

  7. qt中利用普通函数将调用ui界面的控件

    一.新建qt程序,界面如图所示: 二.在.h文件中: #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #in ...

  8. C# 从SQL server 数据库中调取数据并将返回结果加入menustrip控件中,并对单击控件选项后变化进行编辑

    首先此操作需要自己增加调用的库有System.Data.SqlClient 调用好库后进行下一步操作:连接数据库 string datasource = "10.61.1.77,1433&q ...

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

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

最新文章

  1. Python2.7连接MySQL5.7 附demo
  2. 关于ipconfig中setclassid的初步认识
  3. SpringMVC的数据响应-回写数据-返回对象或集合2(应用)
  4. SasSHRM中基于shiro的认证授权:需求分析
  5. 知乎超热门话题:为什么要考985?
  6. java 类的高级特性_java程序-类的高级特性
  7. linux翻转字符串
  8. 简单的路由封装ppp
  9. UCenter密码算法规则和生成方法
  10. AI未来 - 李开复 - 未来8成的工作受影响 - 读后感
  11. 第十届蓝桥杯 省赛研究生组 真题解析(Python)
  12. Git--可视化管理工具-SourceTree
  13. 吉林省谷歌高清卫星地图下载
  14. 【Python脚本进阶】1.2、python脚本基础知识(下)
  15. java异常处理-小白学习中
  16. Word怎么删除空白页? 告诉你6招技巧
  17. 【知乎解密(最新版-rpc版本)】
  18. VUE 物理返回键的处理
  19. html5能调用手机陀螺仪么,详解html5如何获取手机陀螺仪角度信息的示例代码
  20. 计算机部分应用显示模糊,电脑显示器局部模糊怎么办

热门文章

  1. 表格存储 SQL 查询多元索引
  2. 揭秘大流量场景下发布如「丝般顺滑」背后的原因
  3. 力展物流公司上云 低成本、实例资源使用效率提升
  4. 基于深度学习的图像分割在高德的实践
  5. 支付宝王益:40岁写30年代码是一种什么体验?
  6. 编码规范 | Java函数优雅之道(下)
  7. IoT SaaS加速器——助力阿尔茨海默病人护理
  8. 深度学习最佳实践系列——权重w初始化
  9. 五位专家跟你讲讲为啥Python更适合做AI/机器学习
  10. Aruba 推出Instant On 为中小型企业提供安全、高速的无线连接