【QT小作】使用结构体数据生成读写配置文件代码

意图

使用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("");
    }
}
代码程序下载

下载

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值