当前位置:网站首页>Qt通过QSttings类读取*.ini配置文件
Qt通过QSttings类读取*.ini配置文件
2022-07-30 05:39:00 【林夕07】
ini文件
什么是ini文件
INI(Initialization File)是微软Windows操作系统中的文件扩展名。这些字母表示初始化。正如该术语所表示的,INI文件被用来对操作系统或特定程序初始化或进行参数设置。在项目也会将一些配置信息存于ini文件,所以读取配置文件是项目中不可缺少的一部分。由于ini只有节和参数比较简单,在Qt中又有QSettings类使得更加便捷。
格式
INI文件由节、键、值组成。
节 [section]
参数 (键=值) name=value
注解 注解使用分号表示(;)。在分号后面的文字,直到该行结尾都全部为注解。如; comment textINI文件的数据格式的例子(配置文件的内容) [Section1 Name]
KeyName1=value1
KeyName2=value2
...
[Section2 Name]
KeyName21=value21
KeyName22=value22
其中:
[Section1 Name]用来表示一个段落。
需要的参数
头文件:#include <QSettings>
qmake: QT += core; (一般的qt工程默认会配置core)
需要了解的API
构造函数:QSettings(const QString &fileName, Format format, QObject *parent = Q_NULLPTR)
fileName:文件名(包括路径,注意转义)
Format:是枚举类型。该enum类型指定QSettings使用的存储格式。
parent: 父类
下图Qt官方文档原文
中文对照
| 类型 | 值 | 说明 |
|---|---|---|
| QSettings::NativeFormat | 0 | C使用最适合平台的存储格式。 在Windows上,这意味着系统注册表; 在macOS和iOS上,这意味着CFPreferences API; 在Unix上,这意味着INI格式的文本配置文件。 |
| QSettings::Registry32Format | 2 | 仅限Windows:从64位Windows上运行的64位应用程序显式访问32位系统注册表。 在32位Windows上或从64位Windows上的32位应用程序中,此操作与指定NativeFormat相同。 这个enum值是在Qt 5.7中添加的。 |
| QSettings::Registry64Format | 3 | 仅限Windows:从运行在64位Windows上的32位应用程序显式访问64位系统注册表。 在32位Windows上或从64位Windows上的64位应用程序中,此操作与指定NativeFormat相同。 这个enum值是在Qt 5.7中添加的。 |
| QSettings::IniFormat | 1 | 将设置存储在INI文件中。 |
| QSettings::InvalidFormat | 16 | 由registerFormat()返回的特殊值。 |
这里的话我们一般用的是QSettings::IniFormat。
设置参数的值: void setValue(const QString &key, const QVariant &value)
获取参数的值: QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const
这里defaultValue意思是如果未找到该参数的值将会返回你给你默认值,否则返回空或者0。
单例
单例有其独有的使用场景,一般是对于那些业务逻辑上限定不能多例只能单例的情况,例如:类似于计数器之类的存在,一般都需要使用一个实例来进行记录,若多例计数则会不准确。 其实单例就是那些很明显的使用场合,没有之前学习的那些模式所使用的复杂场景,只要你需要使用单例,那你就使用单例,简单易理解。
所以读取配置文件也需要设计成单例模式。主要分为单线程使用和多线程使用。下面列出了俩种的实例。
单线程实例
#pragma once
#include <thread>
#include <mutex>
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton* NewObject()//无参版本
{
if (sm_obj == nullptr)
{
sm_obj = new Singleton;
}
return sm_obj;
}
static Singleton* NewObject(int a, char b, double c)//有参版本
{
if (sm_obj == nullptr)
{
sm_obj = new Singleton(a, b, c);
}
return sm_obj;
}
void DelObject()
{
if (Singleton::sm_obj != nullptr)
{
delete sm_obj;
sm_obj = nullptr;
}
}
private:
Singleton()
{
m_a = 0;
m_b = 0;
m_c = 0;
}
Singleton(int a, char b, double c)
{
m_a = a;
m_b = b;
m_c = c;
}
~Singleton(){
}
Singleton(const Singleton& other){
}
void operator=(const Singleton* ohter){
}
private:
static Singleton* sm_obj;
int m_a;
char m_b;
double m_c;
};
Singleton* Singleton::sm_obj = nullptr;//懒汉模式,以时间换空间
//Singleton* Singleton::sm_obj = new Singleton;//饿汉模式,以空间换时间
多线程实例
#pragma once
#include <thread>
#include <mutex>
#include <iostream>
using namespace std;
mutex g_m;//创建锁
class Singleton
{
public:
static Singleton* NewObject()//无参版本
{
//双重校验锁
if (sm_obj == nullptr)//增加效率
{
加锁防止多线程同时创建造成内存泄漏
lock_guard<mutex> lg(g_m);//守卫锁,也叫自解锁。防止异常死锁
//g_m.lock();
if (sm_obj == nullptr)
{
sm_obj = new Singleton;
}
//g_m.unlock();
}
return sm_obj;
}
static Singleton* NewObject(int a, char b, double c)//有参版本
{
//双重校验锁
if (sm_obj == nullptr)//增加效率
{
//加锁防止多线程同时创建造成内存泄漏
//守卫锁,也叫自解锁。防止异常死锁
lock_guard<mutex> lg(g_m);
if (sm_obj == nullptr)
{
sm_obj = new Singleton(a, b, c);
}
}
return sm_obj;
}
void DelObject()
{
if (Singleton::sm_obj != nullptr)
{
delete sm_obj;
sm_obj = nullptr;
}
}
private:
Singleton()
{
m_a = 0;
m_b = 0;
m_c = 0;
}
Singleton(int a, char b, double c)
{
m_a = a;
m_b = b;
m_c = c;
}
~Singleton(){
}
Singleton(const Singleton& other){
}
void operator=(const Singleton* ohter){
}
private:
static Singleton* sm_obj;
int m_a;
char m_b;
double m_c;
};
Singleton* Singleton::sm_obj = nullptr;//懒汉模式,以时间换空间
//Singleton* Singleton::sm_obj = new Singleton;//饿汉模式,以空间换时间
设计一个读取ini文件的类
首先正常创建一个qt的工程,有无ui界面都可以。如下图。
然后创建一个1.ini文件。内容可以照抄下面的,[]是节的固定格式,里面的system就是节的名称。下面就ip=121.52.52.5就是赋值。
AppSettings类
头文件
#ifndef APPSETTINGS_H
#define APPSETTINGS_H
#include <string>
#include <QSettings>
#include <QMutex>
#include <QMutexLocker>
class AppSettings
{
public:
static AppSettings* Instance();
void Init(QString fileName);
QString GetIp() const;
void SetIp(QString ip);
private:
AppSettings();
~AppSettings();
private:
QSettings* settings;
static AppSettings* sm_obj;
};
#endif // APPSETTINGS_H
源文件
#include "appsettings.h"
QMutex g_m;
AppSettings* AppSettings::sm_obj = nullptr;//懒汉模式,以时间换空间
AppSettings *AppSettings::Instance()
{
if(sm_obj == nullptr)
{
QMutexLocker lg(&g_m);
if(sm_obj == nullptr)
{
sm_obj = new AppSettings();
}
}
return sm_obj;
}
void AppSettings::Init(QString fileName)
{
settings = new QSettings(fileName, QSettings::IniFormat);
settings->setIniCodec("GBK");
}
QString AppSettings::GetIp() const
{
return settings->value("system/ip", "127.0.0.1").toString();
}
void AppSettings::SetIp(QString ip)
{
settings->setValue("system/ip", ip);
}
AppSettings::AppSettings()
{
}
AppSettings::~AppSettings()
{
}
调用代码
AppSettings::Instance()->Init("1.ini");
AppSettings::Instance()->SetIp("12.52.52.5"); // 给Ip赋值
qDebug() << AppSettings::Instance()->GetIp(); // 获取Ip的值
运行结果
边栏推荐
- np.argsort()函数详细解析
- [Image detection] Research on cumulative weighted edge detection method based on grayscale image with matlab code
- 机器学习—梯度下降Gradient Descent Optimization—c语言实现
- 453.最小操作数使数组元素相等
- SRA数据下载方法总结
- navicat连接MySQL报错:1045 - Access denied for user ‘root‘@‘localhost‘ (using password YES)
- Summary of SQL classic interview questions in 2022 (with analysis)
- 【图像处理】基于中轴变换实现图像骨架提取附matlab代码
- 934.最短的桥(广度优先搜索)
- mysql 时间字段默认设置为当前时间
猜你喜欢

MySQL的存储过程

2022年比若依更香的开源项目

Solve the problem that the local nacos is not configured but the localhost8848 connection exception always occurs

Difference between cookie and session

【图像检测】基于灰度图像的积累加权边缘检测方法研究附matlab代码

650.只有两个键的键盘(动态规划)

Navicat connection MySQL error: 1045 - Access denied for user 'root'@'localhost' (using password YES)

417.太平洋大西洋水流问题

每日练习------输出一个整数的二进制数、八进制数、十六进制数。

406.根据身高重建队列
随机推荐
flask-socketio实现的网页聊天室(一)
PyCharm usage tutorial (more detailed, picture + text)
安装Nuxt.js时出现错误:TypeError:Cannot read property ‘eslint‘ of undefined
np.where()用法
I/O多路复用技术
131.分割回文串
[GStreamer] The name of the plugin should match GST_PLUGIN_DEFINE
cookie和session区别
[Koltin Flow (1)] Five ways to create flow
list(列表)和array(数组)的区别
MySQL 数据库基础知识(系统化一篇入门)
成绩排序(华中科技大学考研机试题)(DAY 87)
cnpm安装步骤
【图像处理】基于中轴变换实现图像骨架提取附matlab代码
net start mysql MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。
机器学习—梯度下降Gradient Descent Optimization—c语言实现
Numpy 中 np.vstack() 和 np.hstack() 简单解析
navicat新建数据库
G Bus Count (Google Kickstart2014 Round D Problem B) (DAY 89)
MySQL 有这一篇就够(呕心狂敲37k字,只为博君一点赞!!!)