当前位置:网站首页>[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
边栏推荐
猜你喜欢
软件测试年终总结报告模板

主动学习(active learning)

机 器 学 习

Crawler learning 5--- anti crawling identification picture verification code (ddddocr and pyteseract measured effect)

程序猿学习抖音短视频制作

427-二叉树(617.合并二叉树、700.二叉搜索树中的搜索、98. 验证二叉搜索树、530.二叉搜索树的最小绝对差)

Formation and release of function stack frame

JVM object composition and storage

426 binary tree (513. find the value in the lower left corner of the tree, 112. sum of paths, 106. construct a binary tree from the middle order and post order traversal sequence, 654. maximum binary

IDEA一键生成Log日志
随机推荐
【Cocos Creator 3.5.1】event.getButton()的使用
TiDB 中的SQL 基本操作
TiDB 基本功能
Openresty usage document
IAR Systems全面支持芯驰科技9系列芯片
Multithreading basic part2
Program ape learning Tiktok short video production
Active learning
Multithreading basic Part3
Win 10 如何打开环境变量窗口
Multithreading basic part part 1
【Cocos Creator 3.5.1】event. Use of getbutton()
软件测试年终总结报告模板
Senior [Software Test Engineer] learning route and necessary knowledge points
[cultivation system] common regular expressions
Gaussian distribution, linear regression, logistic regression
免费的 SSH 和 Telnet 客户端PuTTY
TiDB与 MySQL 兼容性对比
思维的技术:如何破解工作生活中的两难冲突?
Dev++ 环境设置C语言关键字显示颜色