当前位置:网站首页>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的值
运行结果
边栏推荐
- flask的笔记
- MySQL模糊查询性能优化
- 2022年SQL大厂高频实战面试题(详细解析)
- This dependency was not found:
- flask使用token认证
- mysql time field is set to current time by default
- 从底层结构开始学习FPGA(6)----分布式RAM(DRAM,Distributed RAM)
- 81.搜索旋转排序数组II(数组旋转后二分查找)
- CISP-PTE真题演示
- Different lower_case_table_names settings for server ('1') and data dictionary ('0') solution
猜你喜欢

MySQL笔记(pymysql)

51.N皇后(回溯法)

St. Regis Takeaway Project: New dishes and dishes paged query

PyCharm使用教程(较详细,图+文)
![[其他] DS5](/img/20/6863bb7b58d2e60b35469ba32e5830.png)
[其他] DS5

240.搜索二维矩阵II

Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案

PyCharm usage tutorial (more detailed, picture + text)

cnpm installation steps

【图像检测】基于灰度图像的积累加权边缘检测方法研究附matlab代码
随机推荐
[GO Language Basics] 1. Why do I want to learn Golang and the popularization of GO language entry
Arrange numbers (DAY90) dfs
cookie和session区别
MySQL Soul 16 Questions, how many questions can you last?
2022年SQL经典面试题总结(带解析)
417.太平洋大西洋水流问题
[GLib] 什么是GType
个人博客系统(附源码)
240.搜索二维矩阵II
Navicat connection MySQL error: 1045 - Access denied for user 'root'@'localhost' (using password YES)
[GStreamer] 插件的名字要和GST_PLUGIN_DEFINE匹配
934.最短的桥(广度优先搜索)
[Koltin Flow (1)] Five ways to create flow
HCIP-第九天-BGP(边界网关协议)
cmd(命令行)操作或连接mysql数据库,以及创建数据库与表
成绩排序(华中科技大学考研机试题)(DAY 87)
81.搜索旋转排序数组II(数组旋转后二分查找)
create-nuxt-app创建出来的项目没有server
646.最长数对链(动态规划)
More fragrant open source projects than Ruoyi in 2022