Qt 读写 .ini 文件

7 篇文章 0 订阅
5 篇文章 0 订阅

Qt 读写 .ini 文件

  • 嗯 百度又一大堆为啥要费时间自己写呢
    • 在实际中用到了
    • 方便自己看 时间久了忘记的话
  • 测试环境 Qt5.12.10 QtCreator 4.13.1 MinGW32bit 虽然这个对环境没啥要求
  • 以下将介绍 Qt对.ini文件读写操作的一些方法 以及个人对一些问题的尝试
  • 开始正题
.ini文件
  • Initialization File 初始化文件的缩写 由节、键、值组成。 “;” 到行尾为注释

    [section]  ;节   
    key=value  ;键 = 值 
    
  • 基本结构是这样 如果想更加深入的了解可以必应

使用到的库
#include <QSettings>  
#include <QDebug>      //用于打印输出

QSettings 在Qt里面不只是读取 .ini文件的功能 这里不多说

写操作
void MainWindow::writeToIni()
{
    QSettings *configIniWrite = new QSettings("config.ini",QSettings::IniFormat);
    configIniWrite->setValue("User/user","H");
    configIniWrite->setValue("User/pass","66666");
    configIniWrite->setValue("addr/ip","192.168.1.1");
    configIniWrite->setValue("addr/port","6000");

    delete configIniWrite;
}
  • 使用 QSettings 的构造函数 传入文件路径以及文件名 设置格式为 QSettings::IniFormat 直接使用setValue() 设置需要写的节点 在config.ini 文件中写入结果

    [User]
    user=H
    pass=66666
    
    [addr]
    ip=192.168.1.1
    port=6000
    
读操作
void MainWindow::readToIni()
{
    QSettings *configIniRead = new QSettings("config/config.ini",QSettings::IniFormat);
    QString user = configIniRead->value("User/user").toString();
    QString pass = configIniRead->value("User/pass").toString();
    QString ip = configIniRead->value("addr/ip").toString();
    QString port = configIniRead->value("addr/port").toString();

    qDebug()<<"user:"<<user;
    qDebug()<<"pass:"<<pass;
    qDebug()<<"ip:"<<ip;
    qDebug()<<"port:"<<port;
   
}
  • 这里读操作获取数据 用 value() 设置需要获取的节点就行

  • 把刚才写入的信息在读取出来 控制台输出

    user: "H"
    pass: "66666"
    ip: "192.168.1.1"
    port: "6000"
    
  • 还可以使用 allkeys 读取所有键值

     qDebug()<<"allkeys:"<<configIniRead->allKeys();
    
  • 读取结果如下:

    allkeys: ("User/pass", "User/user", "addr/ip", "addr/port")
    
  • 上面的结果 使用字符串拆分

    //使用 allkeys 遍历
    QList<QString> keyString;
    keyString<<configIniRead->allKeys();
    qDebug()<<"keyString:"<<keyString;
    QList<QList<QString>>  keyList;
    for(int i=0;i<keyString.size();i++)
    {
    keyList<<keyString.at(i).split("/");
    if(keyList.at(i).at(0) == "User")
    {
    qDebug()<<"User Key:"<<keyList.at(i).at(1)<<"Value:"<<configIniRead->value(keyString.at(i)).toString();
    }
    if(keyList.at(i).at(0) == "addr")
    {
    qDebug()<<"addr Key:"<<keyList.at(i).at(1)<<"Value:"<<configIniRead->value(keyString.at(i)).toString();
    }
    
    }
    qDebug()<<"keyList:"<<keyList;
    
  • 打印调试结果:

    keyString: ("User/pass", "User/user", "addr/ip", "addr/port")
    User Key: "pass" Value: "66666"
    User Key: "user" Value: "H"
    addr Key: "ip" Value: "192.168.1.1"
    addr Key: "port" Value: "6000"
    keyList: (("User", "pass"), ("User", "user"), ("addr", "ip"), ("addr", "port"))
    
  • 有时候并不知道(或者程序不知道)节点名 或者数据拆分太麻烦 allkeys() 就不能满足我们的需求了

  • 这时使用 childGroups() 读取

    QList<QString> keyGrophs;
    keyGrophs<<configIniRead->childGroups();
    qDebug()<<"ChildGrouphs:"<<keyGrophs;
    configIniRead->beginGroup(keyGrophs.at(1));
    //因都在节点  keyGrophs.at(1) 下  childKeys   allKeys 都可访问数据
    QList<QString> keyChild;
    keyChild<<configIniRead->childKeys();
    qDebug()<<"childkeys:"<<keyChild;
    qDebug()<<"ip:"<<configIniRead->value(keyChild.at(0));
    
    QList<QString> keyAll;
    keyAll<<configIniRead->allKeys();
    qDebug()<<"keyAll:"<<keyAll;
    qDebug()<<"ip:"<<configIniRead->value(keyAll.at(0));
    
    configIniRead->endGroup();
    
  • 使用 childGroups() 读取必须用 beginGroup()表示开始 endGroup()表示结束 (没有结束的话后面QSettings 不能正常操作)

    configIniRead->beginGroup(keyGrophs.at(1));
    //中间跟对当前节点下的读写操作
    configIniRead->endGroup();
    
  • 同时这里验证在beginGroup()下的操作都是当前节点 allkeys() 读到的结果跟 childKeys()一致

    ChildGrouphs: ("User", "addr")
    childkeys: ("ip", "port")
    ip: QVariant(QString, "192.168.1.1")
    keyAll: ("ip", "port")
    ip: QVariant(QString, "192.168.1.1")
    
  • 以上是个人实际应用测试实践结果 如有不对希望各大网友批评指正

  • 测试源码

参考

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值