首页 > 其他分享 >总结:Qt读写ini配置文件(QSettings)

总结:Qt读写ini配置文件(QSettings)

时间:2023-05-11 11:11:07浏览次数:39  
标签:文件 setValue Qt 配置文件 value QSettings ini setting

声明:资料整理自网络资源,未能全部注明引用来源,如有侵权请联系。

一、ini文件介绍

.ini 文件是Initialization File的缩写,即初始化文件。INI文件被用来对操作系统或特定程序初始化或进行参数设置,以实现不同用户的要求。一般不用直接编辑这些.ini文件,应用程序的图形界面即可操作以实现相同的功能。在Qt中可以使用QSetting类来实现ini文件的读取和写入。

二、ini文件格式

ini文件主要有节(section)、键(key)、键值(value)部分组成。节 (section) 用方括号括起来,单独占一行,例如:[section]键(key)又名属性(property),单独占一行用等号连接键名和键值,例如:name=value例子
[Section1 Name]   
KeyName1=value1   
KeyName2=value2   
...   
[Section2 Name]   
KeyName21=value21   
KeyName22=value22 
其中:[Section1 Name]用来表示一个段落。因为INI文件可能是项目中共用的,所以使用[Section Name]段名来区分不同用途的参数区。注意:使用分号表示(;)。在分号后面的文字,直到该行结尾都全部为注解。

三、QSettings

Qt通过QSettings类读写ini文件。QSettings的存储设置,每个设置都由一个QString和一个QVariant组成,QString指定设置的名称(键),QVariant存储与该键关联的数据。 
头文件:QSetting.h
QSetting读写ini文件的步骤为:
    * 通过路径名称打开文件并设定为ini文件格式
    * 读/写数据
    * 关闭文件,删除句柄
QSettings::Format有两种:
QSettings::NativeFormat在windows平台可以读写windows注册表;QSettings::IniFormat可以读写ini格式的配置文件。

3.1 写ini文件

// 根据ini文件路径新建QSettings类
QSettings  m_IniFile = new QSettings("ini文件的路径", QSettings::IniFormat);
 //通过setValue函数将键值对放在相对于的节下面
m_IniFile->setValue( "节名" + "/" + "键名",  "键对应的值");
delete m_IniFile;

分组写入
//根据ini文件路径新建QSettings类
QSettings  m_IniFile = new QSettings("ini文件的路径", QSettings::IniFormat);
m_IniFile ->beginGroup("节名");     // 设置当前节名,代表以下的操作都是在这个节中
m_IniFile->setValue( "键名",  "键对应的值"); // 因为上面设置了节了,这里不在需要把节名写上去
m_IniFile.endGroup();                   // 结束当前节的操作
delete m_IniFile;

//Qt中使用QSettings类读写ini文件
//QSettings构造函数的第一个参数是ini文件的路径,第二个参数表示针对ini文件,第三个参数可以缺省
QSettings *configIniWrite = new QSettings("config.ini", QSettings::IniFormat);
//向ini文件中写入内容,setValue函数的两个参数是键值对
//向ini文件的第一个节写入内容,ip节下的第一个参数
configIniWrite->setValue("/con/ip", "192.168.0.1");
//向ini文件的第一个节写入内容,ip节下的第二个参数
configIniWrite->setValue("/con/name", "aa");
//向ini文件的第二个节写入内容,port节下的第一个参数
configIniWrite->setValue("port/open", "2222");
configIniWrite->setValue("port/ports", "2222,111,33,444");
//写入完成后删除指针
delete configIniWrite;

生成文件 config.ini
[con]
ip=192.168.0.1
name=aa

[port]
open=2222
ports="2222,111,33,444"

3.2 读ini文件

//通过Value函数将节下相对应的键值读取出来
QString value = m_IniFile->Value( "节名" + "/" + "键名").toString;
//打开文件并指定为ini格式
QSettings* configIni = new QSettings(file_path, QSettings::IniFormat);
QString qTemp = "";
//读指定节点的指定数据,其中“Log”为节点,save_days为具体数据项
logDays = configIni->value("Log/save_days").toInt();
qTemp = configIni->value("Log/print_debug").toString();
printDbgLog = qTemp.compare("true", Qt::CaseInsensitive) == 0 ? true : false;
//删除指针,此处未关联父对象,必须手动删除,否则有内存泄露风险
delete configIni;

分组读取
settings.beginGroup("Setting");
QString strName = settings.value("Name").toString();
int nVersion = settings.value("Version").toInt();
settings.endGroup();
//Name:Qt Creator  Version:5

settings.beginGroup("User");
QString strUserName = settings.value("UserName").toString();
QString strPassword = settings.value("Password").toString();
settings.endGroup();
//UserName:WangL  Password:123456

[conn]
name=aaa
ip="192.168.1.10"
auto_con=1
speed=50
joints=0.000,-13.959,2.2,83.3,0.000,18.000,-30.000
tcp_offset= 133.4,0.0,0.0,0.0,0.0,-10.0

读配置文件
QSettings setting("config.ini",QSettings::IniFormat);
setting.setIniCodec("utf-8");// 解决乱码
QString name =setting.value("conn/name").toString();
int speed =setting.value("conn/speed").toInt();

qDebug() << name;
qDebug() << speed;

输出:
"aaa"
50

四、问题总结

4.1 QSettings写入数据丢失

在实际使用中,QSettings的写操作在某些情况下会丢失数据。尤其在嵌入式Liunx环境中,通过断电方式关机,更容易丢失数据。原因分析:1,Qt的保存机制是先写到一个临时文件中,然后定时去同步到磁盘,所以不能实时生效。2,setValue函数设置指定KEY的值,若该值已存在则替换先前的值,但不立即回写文件。3,QSettings类的sync方法并不能立刻同步到磁盘上,需要使用系统sync或syncFlushFileBuffers进行同步。
解决措施:1,在写完后调用QSettings的函数settings.sync();2,调用Linux系统的shell命令system("sync");
#include <QtCore/QtCore>
#include <QSettings>
#include <QFile>
#include <QDebug>
#include <QTextCodec> 
 
void ConfigSetting(void)
{
    //文件路径+文件名
    QString fileName = QCoreApplication::applicationDirPath() + "/Config.ini";
    //创建配置目标,输入文件路径,文件格式
    QSettings *setting = new QSettings(fileName , QSettings::IniFormat);
    //设置文件编码,配置文件中使用中文时,这是必须的,否则乱码
    setting->setIniCodec(QTextCodec::codecForName("UTF-8"));
    // 判断文件是否存在
    if(QFile::exists(fileName)){// 文件存在,读出配置项
        // 这里的setting->value的第二参数,是配置项缺省值,即当读取的配置项不存在时,读取该值
        // User是配置组,name和age是配置项
        QString name = setting->value("User/name", "张三").toString();
        int age = setting->value("User/age", 30).toInt();
    }else {// 文件不存在,写入配置项,生成配置文件
        setting->setValue("User/name", "张三");
        setting->setValue("User/age", 30);
        // setValue只是把配置项写入了缓冲区,若要写入文件,还需执行同步
        // 不同步,无法写入文件,无法生成文件
        setting->sync();
        system("sync");//将内核缓冲写入文件(磁盘)
    }
    delete setting;
}

4.2 QSettings读取ini配置文件乱码

QSetting中的key值与项目标题如果用中文的话,打开会是乱码。QSetting中变量值中如果包含分号,则值字符串需要用双引号(" ")来引用,否则取值时候,只会取值到该变量第一个分号之前的内容。

4.3 QSettings保存float 类型数据时乱码

使用QSettings 将 float 类型的数据写入到ini时float dx = 1.0;
  sParamSetting->setValue("SectionData/d_correct",dx);
ini文件中内容如下:
d_correct=@Variant(\0\0\0\x87\xbeH\xb4\x39)
这是因为 QSettings在写float类型时有点问题,可以将float强制转化为double就可以了。也可以将变量设置为double dx = 1.0;
sParamSetting->setValue("SectionData/d_correct", (double)(sCorrectParam.lcz_correct));

资料来源https://www.cnblogs.com/qianxiaoPro/p/15623881.htmlhttps://www.cnblogs.com/xiangtingshen/p/11145974.htmlhttps://blog.csdn.net/yinyuchen1/article/details/75093895https://www.cnblogs.com/mzy-google/p/5162107.htmlhttps://blog.csdn.net/qq_33485434/article/details/80483883https://blog.csdn.net/weixin_40583088/article/details/104660595






































标签:文件,setValue,Qt,配置文件,value,QSettings,ini,setting
From: https://www.cnblogs.com/bog-box/p/17390466.html

相关文章

  • Qt QTimer::singleShot问题及用法
    问题描述问题描述:QTimer::singleShot定时器事件超时,如果此时类内对象已经被回收,定时器事件调用已经释放的类内资源时会引起崩溃1voidfunc()2{3QTimer::singleShot(50,[=](){4this->continueNodeTask();5});6}78/*9如果singleShot事......
  • Qt QTimer::singleShot用法
    [static]voidQTimer::singleShot(intmsec,constQObject*receiver,constchar*member)这个静态函数在一个给定时间间隔msec(毫秒)之后调用一个槽。用法1:假设类A有个槽函数function(){}我们要在10s之后执行它就可以: QTimer::singleShot(10*1000,this,&A::func......
  • Vue2项目中,在编译打包后通过读取配置文件,任意修改接口地址
    可以按照以下步骤进行操作: 1.在项目根目录下创建一个名为`config`的文件夹,并在该文件夹下创建一个名为`index.js`的文件,用来存放配置文件,如: ```javascriptmodule.exports={  apiRoot:'http://api.example.com'}``` 这里定义了一个`apiRoot`属性,用来存放接口地......
  • Qt - 中英文翻译
    步骤如下:1、创建ts文件 2、修改UI,并更新ts文件 3、翻译工具打开进行翻译 4、发布生成qm文件 5、将qm文件加入到qrc文件中 6、软件代码中实现   ......
  • SpringBoot 配置文件加载优先级
    我们在使用springboot开发的时候,经常会从外部获取属性值,为了记住这些规则,特此做如下记录~~~一、为什么要做外部化配置本地开发的时候,上传文件的时候,每个人想上传的路径不一样,使用外部配置,就可以单独设置自己的上传路径项目部署的时候,不同的环境使用不同的配置,使用外部挂载配置这......
  • 龙芯3a5000处理器下编译Qt源码
    1、下载Qt源码,archive/qt/5.12/5.12.8/single/qt-everywhere-src-5.12.8.tar.xz2、安装依赖库:sudoapt-getinstallflexsudoapt-getinstallbisonsudoapt-getinstallgperfsudoapt-getinstallbuild-essentialsudoapt-getinstalllibgl1-mesa-devsudoapt-getin......
  • 关于arcgis和postgresql数据库创建企业级地理数据库的配置文件
    第一:需要将arcgis的C:\ProgramFiles(x86)\GeoScene\Desktop\Desktop10.8\DatabaseSupport\PostgreSQL\12\Windows64这个路径下的文件拷贝到postgresql数据库的安装目录的lib文件夹中;第二:需要将五个文件libeay32.dll、libiconv-2.dll、libintl-8.dll、libpq.dll和ssleay32.d......
  • qt导入头文件报错
    刚交接同事的qt项目,环境是: 工程中在源代码引用文件或自己写方法调用到一些外部或系统库,编译会报一大堆错,重复引用等等。这种情况在vc上面是不会出现,搞不懂qt为什么这样,急暂未找到解决方案。尝试了一两天,后来发现不要再原来代码写,单独从工程菜单添加先模块,在新模块里面去写,然后......
  • Qt开发-共享内存使用范例,配合开发者密钥使用后台调试程序或者进入调试模式
    共享内存就之前不是开发了一个Leventure_DeveloperKey用以调试程序嘛,在这里简单聊一下调试模式的方案。这里的调试分为了两种,一种是调试模式,一种是开发者模式。需要这两种模式的原因也很简单:1.在远程调试的时候,我可能需要程序从头开始进入调试,这就要求程序一直卡在开头的某个位......
  • QT中线程睡眠对数据IO的影响——串口bug记录
    这两天用QT做一个上位机,涉及到有一个数据发送完后需要用到延时,我一开始使用了线程休眠的方式进行延时://发送读取指令if(serialport->write(data)==-1){qDebug()<<"发送失败!";}QThread::msleep(1000);serialport->clear();然后我发现data并没有被发......