意图
使用QT在编写读写配置文件代码时,都是比较简单的的数据读写,但代码写起来比较繁琐,所以就想着写个小程序自动生成这部分代码来方便自己(好像以前在网上有看过别人实现类似的功能,想着自己也实现一个,嘻嘻!)
功能
- 使用结构体数据生成代码
- 支持常用的数据类型
效果
代码
.h文件
#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文件
#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配置文件代码生成器");
ui->radioButtonPrefix1->setChecked(true);
// 初始化键值对
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 = "";
// 获取组名
QRegularExpression re("(struct (?<groupName>[\\w|_]+) {)");
QRegularExpressionMatch match = re.match(structData);
if (match.hasMatch()) {
groupName = match.captured("groupName");
}
// 获取键值对
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();
// 定义settings对象
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);
// 支持中文
if (ui->checkBoxSuppChinese->isChecked()) {
QString codec = QString(R"(settings.setIniCodec(QTextCodec::codecForName("utf-8"));)");
ui->textEditRead->append(codec);
ui->textEditWrite->append(codec);
}
// 空行
ui->textEditRead->append("");
ui->textEditWrite->append("");
// 获取前缀
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();
}
// 获取结构体数据
// 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));
// 空行
ui->textEditRead->append("");
ui->textEditWrite->append("");
}
}