当前位置:网站首页>[QT] use structure data to generate read / write configuration file code
[QT] use structure data to generate read / write configuration file code
2022-06-27 06:09:00 【Lin Qi sevenlin】
Intention
Use QT When writing the read / write configuration file code , Are relatively simple data reading and writing , But the code is cumbersome , So I want to write a small program to automatically generate this part of the code for my own convenience ( It seems that I have seen others implement similar functions on the Internet before , Think about realizing one , Hee hee !)
function
- Use structure data to generate code
- Support common data types
effect

Code
.h file
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMap>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
using KeyValueMap = QMap<QString, QString>;
using keyValuePairVec = QVector<QPair<QString, QString>>;
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
QPair<QString, keyValuePairVec> getFromStructData(const QString &structData);
QString getReadCode(const keyValuePairVec &pairs, const QString &prefix);
QString getReadCode(const QString &groupName, const keyValuePairVec &pairs, const QString &prefix);
QString getWriteCode(const keyValuePairVec &pairs, const QString &prefix);
QString getWriteCode(const QString &groupName, const keyValuePairVec &pairs, const QString &prefix);
private slots:
void on_btnClearRead_clicked();
void on_btnClearWrite_clicked();
void on_btnGenerate_clicked();
private:
Ui::Widget *ui;
KeyValueMap m_keyValueMap;
};
#endif // WIDGET_H
.cpp file
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QRegularExpression>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
setWindowTitle("LQ Configuration file code generator ");
ui->radioButtonPrefix1->setChecked(true);
// Initializing key value pairs
m_keyValueMap.insert("QString", ".toString()");
m_keyValueMap.insert("int", ".toInt()");
m_keyValueMap.insert("bool", ".toBool()");
m_keyValueMap.insert("uint", ".toUInt()");
m_keyValueMap.insert("float", ".toFloat()");
m_keyValueMap.insert("double", ".toDouble()");
m_keyValueMap.insert("QByteArray", ".toByteArray()");
m_keyValueMap.insert("QDateTime", ".toDateTime()");
}
Widget::~Widget()
{
delete ui;
}
QPair<QString, Widget::keyValuePairVec> Widget::getFromStructData(const QString &structData)
{
// struct Person { QString name; int age; };
QPair<QString, keyValuePairVec> groupPair{};
keyValuePairVec pairVec{};
QString groupName = "";
// Get group name
QRegularExpression re("(struct (?<groupName>[\\w|_]+) {)");
QRegularExpressionMatch match = re.match(structData);
if (match.hasMatch()) {
groupName = match.captured("groupName");
}
// Get key value pairs
re.setPattern("([a-z|A-Z]+ [\\w|_]+;)");
QRegularExpressionMatchIterator i = re.globalMatch(structData);
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
QString keyValue = match.captured();
keyValue.remove(";");
QStringList list = keyValue.split(" ");
QPair<QString, QString> tempPair;
tempPair.first = list.at(0);
tempPair.second = list.at(1);
pairVec.append(tempPair);
}
groupPair.first = groupName;
groupPair.second = pairVec;
return groupPair;
}
QString Widget::getReadCode(const Widget::keyValuePairVec &pairs, const QString &prefix)
{
QString code;
for (const auto &pair : pairs) {
QString key = pair.first;
QString value = pair.second;
code += QString(R"(%1%2 = settings.value("%2"))").arg(prefix, value);
code += m_keyValueMap.value(key);
code += ";";
code += "\n";
}
return code;
}
QString Widget::getReadCode(const QString &groupName, const Widget::keyValuePairVec &pairs, const QString &prefix)
{
QString code = "";
code += QString(R"(settings.beginGroup("%1");)").arg(groupName);
code += "\n";
code += getReadCode(pairs, prefix);
code += QString("settings.endGroup();");
return code;
}
QString Widget::getWriteCode(const Widget::keyValuePairVec &pairs, const QString &prefix)
{
QString code;
for (const auto &pair : pairs) {
QString value = pair.second;
code += QString(R"(settings.setValue("%2", %1%2);)").arg(prefix, value);
code += "\n";
}
return code;
}
QString Widget::getWriteCode(const QString &groupName, const Widget::keyValuePairVec &pairs, const QString &prefix)
{
QString code = "";
code += QString(R"(settings.beginGroup("%1");)").arg(groupName);
code += "\n";
code += getWriteCode(pairs, prefix);
code += QString("settings.endGroup();");
return code;
}
void Widget::on_btnClearRead_clicked()
{
ui->textEditRead->clear();
}
void Widget::on_btnClearWrite_clicked()
{
ui->textEditWrite->clear();
}
void Widget::on_btnGenerate_clicked()
{
ui->textEditRead->clear();
ui->textEditWrite->clear();
// Definition settings object
QString configFileName = ui->lineEditFileName->text().trimmed();
QString settingsObj = QString(R"(QSettings settings("%1", QSettings::IniFormat);)").arg(configFileName);
ui->textEditRead->append(settingsObj);
ui->textEditWrite->append(settingsObj);
// Support Chinese
if (ui->checkBoxSuppChinese->isChecked()) {
QString codec = QString(R"(settings.setIniCodec(QTextCodec::codecForName("utf-8"));)");
ui->textEditRead->append(codec);
ui->textEditWrite->append(codec);
}
// Blank line
ui->textEditRead->append("");
ui->textEditWrite->append("");
// Get prefix
QString prefix = "";
if (ui->radioButtonPrefix0->isChecked()) {
}
if (ui->radioButtonPrefix1->isChecked()) {
prefix = ui->radioButtonPrefix1->text();
}
if (ui->radioButtonPrefix2->isChecked()) {
prefix = ui->radioButtonPrefix2->text();
}
if (ui->radioButtonPrefix3->isChecked()) {
prefix = ui->lineEditPrefix->text().trimmed();
}
// Get structure data
// struct Person { QString name; int age; };
QString data = ui->textEditStruct->toPlainText();
QRegularExpression re("(struct [\\w|_]+ { ([a-z|A-Z]+ [\\w|_]+; )+};)");
QString subject(data.simplified());
QRegularExpressionMatchIterator i = re.globalMatch(subject);
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
QString structData = match.captured();
QPair<QString, keyValuePairVec> settingsData = getFromStructData(structData);
ui->textEditRead->append(getReadCode(settingsData.first, settingsData.second, prefix));
ui->textEditWrite->append(getWriteCode(settingsData.first, settingsData.second, prefix));
// Blank line
ui->textEditRead->append("");
ui->textEditWrite->append("");
}
}
Code program download
边栏推荐
猜你喜欢

Altium designer 19 device silk screen label position shall be placed uniformly in batches

JS to implement bidirectional data binding
![Senior [Software Test Engineer] learning route and necessary knowledge points](/img/51/1be2e0812a6bca9e5e8d14bf254254.png)
Senior [Software Test Engineer] learning route and necessary knowledge points

主动学习(active learning)

The risk of multithreading -- thread safety

JVM整体结构解析

LeetCode 0086.分隔链表

Create a basic WDM driver and use MFC to call the driver

JVM common instructions

IDEA一键生成Log日志
随机推荐
1317. convert an integer to the sum of two zero free integers
Small program of C language practice (consolidate and deepen the understanding of knowledge points)
0.0.0.0:x的含义
TiDB 数据库快速上手指南
使用 WordPress快速个人建站指南
Sqlsever 字段相乘后保留2位小数
日期 数据库日期 字符串 之间互相转换
【QT小记】QT元对象系统简单认识
信息系统项目管理师---第七章 项目成本管理
JVM tuning ideas
IAR Systems全面支持芯驰科技9系列芯片
多线程基础部分Part 1
Openresty usage document
Thinking technology: how to solve the dilemma in work and life?
汇编语言-王爽 第8章 数据处理的两个基本问题-笔记
WebRTC系列-網絡傳輸之7-ICE補充之提名(nomination)與ICE_Model
网关状态检测 echo request/reply
js实现双向数据绑定
Convolution neural network -- Application of CNN model (ore prospecting prediction)
What's new in redis4.0 - active memory defragmentation