Qt QSetting 读写自定义结构

Qt 中用Setting写ini文件用以保存软件配置信息是个很方便的信息,一般读写单个值,都很简单,到处都可以找到资料,但对于自定义的结构体如何使用QSetting写入ini和读出,资料较少,下面是我整理且测试成功的方法.

struct myStruct{
    double errorUpper;
    double warnUpper;
    double warnLower;
    double errorLower;
};
Q_DECLARE_METATYPE(myStruct) //告诉Qt你自定的类型,可能需包含#include <QMetaType>

需重载输入输出,好像是因为读写ini文件的时候用的是数据流,具体没细研究,有同学知道也希望说明一下

QDataStream &operator<<(QDataStream &out,const myStruct str)
{
    out << str.errorUpper << str.warnUpper << str.warnLower << str.errorLower;
    return out;
}
QDataStream &operator>>(QDataStream &in,myStruct &str)
{
    in >> str.errorUpper >> str.warnUpper >> str.warnLower >> str.errorLower;
    return in;
}

注册你所定义的结构体,需要放在你需要使用的结构体的前面,如果不确定放什么位置,就放main函数中,保证在最前面

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qRegisterMetaTypeStreamOperators<myStruct>("myStruct");//注册myStruct结构体的操作流,就是重写的输入输出流
    qRegisterMetaType<myStruct>("myStruct");//注册结构体
    MainWindow w;
    w.show();
    return a.exec();
}

现在就可以进行写入和读取结构体了

void MainWindow::on_pushButton_2_clicked()
{
    QSettings setting(QCoreApplication::applicationDirPath() + "/setting.ini",QSettings::IniFormat);
    //setting.setIniCodec(QTextCodec::codecForName("UTF-8")); //在此添加设置,即可读写ini文件中的中文
    myStruct s = {12.4,13.5,21.3,55.3};
    QVariant v = QVariant::fromValue(s);
    setting.setValue("Struct/myStruct",v);
}

void MainWindow::on_pushButton_3_clicked()
{
    QSettings setting(QCoreApplication::applicationDirPath() + "/setting.ini",QSettings::IniFormat);
    //setting.setIniCodec(QTextCodec::codecForName("UTF-8")); //在此添加设置,即可读写ini文件中的中文
    QVariant v = setting.value("Struct/myStruct");
    myStruct os = v.value<myStruct>();
    qDebug() << os.errorUpper << os.warnUpper << os.warnLower << os.errorLower;
}

这样操作确实可以很方便的读和写入结构体,但是在ini文件中不能明码进行改写数据,
写入的结果如下
在这里插入图片描述
我的本意是想既能方便写入和读取结构体,又能在必要时打开ini文件手动修改,使用这种方式虽然能方便写入和读取,但修改却很不方便…

Qt中,你可以使用QXmlStreamReader和QXmlStreamWriter类来读取和写入自定义的XML文件。下面是一个简单的示例演示了如何在Qt中读取和写入自定义的XML文件: ```cpp #include <QFile> #include <QXmlStreamReader> #include <QXmlStreamWriter> #include <QDebug> // 读取XML文件 void readXmlFile(const QString& fileName) { QFile file(fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Failed to open file for reading"; return; } QXmlStreamReader xmlReader(&file); while (!xmlReader.atEnd() && !xmlReader.hasError()) { QXmlStreamReader::TokenType token = xmlReader.readNext(); if (token == QXmlStreamReader::StartElement) { if (xmlReader.name() == "patient") { QString id = xmlReader.readElementText(); qDebug() << "Patient ID:" << id; } else if (xmlReader.name() == "name") { QString name = xmlReader.readElementText(); qDebug() << "Patient Name:" << name; } // Add more conditions for other elements in your XML structure } } if (xmlReader.hasError()) { qDebug() << "XML Error:" << xmlReader.errorString(); } file.close(); } // 写入XML文件 void writeXmlFile(const QString& fileName) { QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "Failed to open file for writing"; return; } QXmlStreamWriter xmlWriter(&file); xmlWriter.setAutoFormatting(true); xmlWriter.writeStartDocument(); xmlWriter.writeStartElement("medical_data"); xmlWriter.writeStartElement("patient"); xmlWriter.writeTextElement("id", "123456789"); xmlWriter.writeTextElement("name", "John Doe"); // Add more elements for other data in your XML structure xmlWriter.writeEndElement(); // Add more elements and nested structures as needed xmlWriter.writeEndElement(); xmlWriter.writeEndDocument(); file.close(); } int main() { QString fileName = "medical_data.xml"; // 读取XML文件 readXmlFile(fileName); // 写入XML文件 writeXmlFile(fileName); return 0; } ``` 在这个示例中,readXmlFile函数演示了如何读取自定义的XML文件。你可以根据XML的结构,使用QXmlStreamReader的方法来读取不同的元素和属性。 writeXmlFile函数演示了如何写入自定义的XML文件。你可以使用QXmlStreamWriter的方法来编写XML的结构和数据。 记得在使用这些方法之前,要添加相关的Qt模块到你的.pro文件中,例如: ``` QT += core xml ``` 这样就可以在Qt中读取和写入自定义的XML文件了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值