qt中根据数据解析的结果动态的创建控件并布局
生活随笔
收集整理的這篇文章主要介紹了
qt中根据数据解析的结果动态的创建控件并布局
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
引言
有時候程序中的控件的個數是無法預測的,當程序啟動時,根據解析的數據動態的創建n行m列的控件,并為其布局。下面記錄一下動態創建控件,并布局。
運行效果
示例
此示例主要是從json配置文件中讀取參數,然后根據參數的個數創建姐買你上的控件并布局。
下面是具體的實現代碼:
main.cpp
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_Hstudentscoredialog.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
整個工程就如上面所示,程序啟動的時候根據從配置文件中獲取的參數來創建控件,并布局,上面雖使用了柵格布局,但設置了姓名和成績的控件的寬度,故而將窗口最大化之后不能很完美的顯示控件,即成績和姓名行編輯器沒有被拉伸,注釋掉對姓名和成績行編輯器的寬度設置后可以最大化窗口,同時拉伸控件。
總結
以上是生活随笔為你收集整理的qt中根据数据解析的结果动态的创建控件并布局的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: postman使用过程中body中的fo
- 下一篇: ajax 在新选卡打开,开始使用 AJA