Qt讀取ini格式配置文件的類設計

目錄

1.引言

2.QSettings

2.1.功能特點

2.2.基本用法

3.讀取ini文件配置通用類設計

3.1.設計要點

3.2.完整實現

3.3.調用方法

4.總結


1.引言

? ? ? ? 在編寫應用程序的時,有些參數需要用戶配置,那么這些參數就涉及到存儲了,單從存儲來講,就有很多實現的方案,比如ini格式文件保存、xml格式文件保存、json格式文件保存,數據庫保存等,其中ini格式文件保存比較簡單,也是平時項目用的比較多的一種,下面就詳細講講Qt中讀取ini格式配置文件的方法和通用類設計。

2.QSettings

????????QSettings 是 Qt 框架中用于讀取和寫入應用程序配置信息的類。它提供了一個跨平臺的解決方案,可輕松地保存和獲取應用程序的設置和狀態。

2.1.功能特點

1)跨平臺支持:QSettings能夠自動適配不同的操作系統,確保配置數據能在不同平臺間無縫遷移。無論是Windows的注冊表、macOS的plist文件,還是INI文件或JSON格式的文件,QSettings都能輕松處理。

2)鍵值對存儲:使用鍵值對的方式來存儲和讀取應用程序的設置信息,使得配置數據的管理變得簡單直觀。

3)多種存儲格式:支持多種存儲格式,包括NativeFormat(使用操作系統推薦的存儲方式)、IniFormat(將數據保存為INI格式的文本文件)和CustomFormat(允許指定自定義的存儲格式,但需配合自定義的QSettings backend實現)。

4)默認值支持:在讀取設置值時,如果找不到指定的鍵,QSettings可以返回預設的默認值。

5)輔助方法:提供了一些輔助方法來處理組織和應用程序范圍的設置,以及檢查設置是否存在、刪除設置項等功能。

2.2.基本用法

創建QSettings對象

在使用 QSettings 之前,首先需要創建一個 QSettings 對象。可以通過以下兩種方式進行初始化:

使用應用程序的組織名稱和應用程序名稱進行初始化:

QSettings settings("組織名稱", "應用程序名稱");

使用配置文件路徑進行初始化:

QSettings settings("ConfigFile/config.ini", QSettings::IniFormat);

注意:如果沒有指定配置文件路徑,QSettings 將使用平臺特定的位置存儲配置信息。

存儲設置值

使用 setValue() 函數可以將鍵值對存儲到配置文件中:

settings.setValue("key", "value");

讀取設置值

使用 value() 函數可以讀取配置文件中的鍵對應的值:

QVariant value = settings.value("鍵");  
// 如果需要特定類型的值,可以使用如下方式:  
QString stringValue = settings.value("鍵").toString();  
int intValue = settings.value("鍵").toInt();

如果要指定默認值,可以在讀取時提供:

QString username = settings.value("username", "DefaultUser").toString();

設置系統編碼

當ini文件的內容中可能有中文,如果不設置編碼,就可能出現亂碼。

QSettings iniRead(file, QSettings::IniFormat);
iniRead.setIniCodec("utf-8"); //解決中文亂碼的情況

檢查設置是否存在

bool exists = settings.contains("鍵");

刪除設置項

使用 remove() 函數可以刪除配置文件中的指定鍵:

settings.remove("key");

持久化設置

在多線程環境中,如果需要確保數據立即寫入持久存儲,可以使用sync()方法:

settings.setValue("Setting1", "Value1");  
settings.sync(); // 強制立即寫入

訪問子組

settings.beginGroup("Window");  
settings.setValue("Width", 800);  
settings.endGroup(); // 可選,用于提高代碼可讀性

綜合示例:

以下是一個使用QSettings保存和恢復窗口位置、大小等設置的示例:

#include <QApplication>  
#include <QMainWindow>  
#include <QSettings>  int main(int argc, char *argv[]) {  QApplication app(argc, argv);  QMainWindow window;  window.setWindowTitle("QSettings Example");  // Load settings  QSettings settings("YourCompany", "YourApp");  window.resize(settings.value("WindowSize", QSize(640, 480)).toSize());  window.move(settings.value("WindowPosition", QPoint(100, 100)).toPoint());  // Connect signals to save settings when necessary  QObject::connect(&window, &QMainWindow::windowStateChanged, [&settings](Qt::WindowState state) {  if (state == Qt::WindowMaximized)  settings.setValue("WindowState", "maximized");  else  settings.setValue("WindowState", "normal");  });  QObject::connect(&window, &QMainWindow::moveEvent, [&](QMoveEvent *event) {  settings.setValue("WindowPosition", event->pos());  });  QObject::connect(&window, &QMainWindow::resizeEvent, [&](QResizeEvent *event) {  settings.setValue("WindowSize", event->size());  });  window.show();  return app.exec();  
}

在這個示例中,我們創建了一個QSettings實例,并在窗口初始化時從其中加載先前保存的尺寸和位置。同時,連接了窗口狀態變化、移動和調整大小的信號,以便在這些事件發生時自動更新存儲的設置。

3.讀取ini文件配置通用類設計

3.1.設計要點

1)應用程序用ini保存系統的配置,一般來說整個程序就一份,可以用單實例模式來實現整個類:

設計模式之單例模式-CSDN博客

class CShortWaveConfig
{
protected:CShortWaveConfig();~CShortWaveConfig();...public:static CShortWaveConfig& instance();....
};

2)普通的編程思路是一行一行得讀取ini文件,然后分別保存到變量中,這樣做不具有批量操性;轉變一下思路,可以一次性把整個文件讀取出來,保存到QMap中,關鍵代碼如下:

class CShortWaveConfig
{
protected:bool loadConfig();。。。
private:QMap<QString, QVariant> m_value;
};bool CShortWaveConfig::loadConfig()
{。。。QStringList allKeys = iniRead.allKeys();for (auto& it : allKeys) {m_value[it] = iniRead.value(it);}return true;
}

3)元素的訪問,每個元素的類型不知道,可利用C++中的模板把元素的類型T傳入,判斷是否可以從QVariant中的類型轉換成T,關鍵代碼如下:

template<typename T>
T value(const QString& key) {auto item = m_value.find(key);if (item != m_value.end()) {const QVariant& value1 = item.value();if (value1.canConvert<T>()) {return value1.value<T>();}assert(false);}。。。
}

4)元素的訪問時,如果傳入的路徑找不到元素,可以返回默認參數,關鍵代碼如下:

template<typename T>
T value(const QString& key, const T& defalutValue) {auto item = m_value.find(key);if (item != m_value.end()) {。。。}return defalutValue;
}

3.2.完整實現

ShortWaveConfig.h

#ifndef _SHORT_WAVE_CONFIG_H_
#define _SHORT_WAVE_CONFIG_H_
#include <QString>
#include <QMap>
#include <QVariant>
#include <assert.h>
using namespace std;class CShortWaveConfig
{
protected:CShortWaveConfig();~CShortWaveConfig();bool loadConfig();public:static CShortWaveConfig& instance();template<typename T>T value(const QString& key, const T& defalutValue) {auto item = m_value.find(key);if (item != m_value.end()) {const QVariant& value1 = item.value();if (value1.canConvert<T>()) {return value1.value<T>();}assert(false);}return defalutValue;}private:QMap<QString, QVariant> m_value;
};#endif

ShortWaveConfig.cpp

#include "ShortWaveConfig.h"
#include <QFile>
#include <QApplication>
#include <QSettings>CShortWaveConfig::CShortWaveConfig()
{bool result = loadConfig();assert(result);
}CShortWaveConfig::~CShortWaveConfig()
{}bool CShortWaveConfig::loadConfig()
{QString file = QCoreApplication::applicationDirPath() + "/systemConfig.ini";if (!QFile::exists(file)) {return false;}QSettings iniRead(file, QSettings::IniFormat);iniRead.setIniCodec("utf-8"); //解決中文亂碼的情況QStringList allKeys = iniRead.allKeys();for (auto& it : allKeys) {m_value[it] = iniRead.value(it);}return true;
}CShortWaveConfig& CShortWaveConfig::instance()
{static CShortWaveConfig config;return config;
}

3.3.調用方法

//姓名
QString name = CShortWaveConfig::instance().value<QString>("Attr/name", "xiaoming");//年齡
int age = CShortWaveConfig::instance().value<int>("Attr/age", 20);

4.總結

????????本文詳細介紹了 Qt 中的 QSettings 類,包括初始化、讀取、寫入和刪除配置信息的操作。還講解了在整個系統中怎么去設計系統配置文件讀取類CShortWaveConfig。通過合理使用類CShortWaveConfig,您可以輕松管理和存儲應用程序的配置信息,提高應用程序的靈活性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40734.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40734.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40734.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git 還原被刪除的分支

在多人項目開發中&#xff0c;有一次碰到忘記合并到master分支了&#xff0c;直接就把開發分支給刪除了&#xff0c;現在記錄下怎么還原被刪除的分支 必須保證刪除的分支之前已經被推送到了遠程倉庫 # 找出被刪除分支的最后一個提交的哈希值 git reflog show# 找到提交哈希值…

2024/07/04

1、梳理筆記(原創) 2、終端輸入一個日期&#xff0c;判斷是這一年的第幾天 scanf("%d-%d-%d",&y,&m,&d); 閏年2月29天&#xff0c;平年2月28天 #include<stdio.h> int main(int argc, char const *argv[]) {int y0,m0,d0;printf("please ente…

析構函數和拷貝構造函數

文章目錄 析構函數1.析構函數的定義&#xff1a;2.析構函數的語法&#xff1a;3.析構函數的特性&#xff1a; 拷貝構造函數1.拷貝構造函數的定義&#xff1a;2.拷貝構造函數的語法3.拷貝構造函數的特性(1)拷貝構造函數是構造函數的一個重載形式**(這個其實也很好理解&#xff0…

鴻蒙開發設備管理:【@ohos.thermal (熱管理)】

熱管理 該模塊提供熱管理相關的接口&#xff0c;包括熱檔位查詢及注冊回調等功能。 說明&#xff1a; 本模塊首批接口從API version 8開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。開發前請熟悉鴻蒙開發指導文檔&#xff1a;gitee.com/li-shi…

如何實現圖片垂直旋轉90度的問題

非常簡單的問題&#xff0c;一串代碼就可以解決。復制修改一下就可以直接使用&#xff0c;一個簡單的小demo。寫項目的時候需要寫的功能&#xff0c;不到二十行代碼就可以實現。 <html> <head><title>旋轉圖片</title><meta http-equiv"Conte…

Land survey boundary report (template)

Land survey boundary report (template) 土地勘測定界報告&#xff08;模板&#xff09;.doc

【高校科研前沿】南京地理與湖泊研究所博士后夏凡為第一作者在環境科學與水資源領域Top期刊發文:鈣對云南洱海溶解有機質與浮游細菌相互作用的調控作用

文章簡介 論文名稱&#xff1a;Calcium regulates the interactions between dissolved organic matter and planktonic bacteria in Erhai Lake, Yunnan Province, China 第一作者及單位&#xff1a;夏凡&#xff08;博士后|中國科學院南京地理與湖泊研究所&#xff09; 通訊…

Git指令

一 參考&#xff1a;https://zhuanlan.zhihu.com/p/389814854 1.clone遠程倉庫 git clone https://git.xiaojukeji.com/falcon-mg/dagger.git 2.增加當前子目錄下所有更改過的文件至index git add . 3.提交并備注‘xxx’ git commit -m ‘xxx’ 4.顯示本地分支 git branch 5.顯…

【pytorch13】激活函數及梯度

什么是激活函數 計算機科學家借鑒生物的神經元機制發明了計算機上的模型&#xff0c;這個模型與生物的神經元非常類似 激活的意思就是z變量要大于0&#xff0c;這一個節點才會激活&#xff0c;否則就會處于睡眠狀態不會輸出電平值 該激活函數在z0處不可導&#xff0c;因此不能…

Asp .Net Core 系列:基于 Castle DynamicProxy + Autofac 實踐 AOP 以及實現事務、用戶填充功能

文章目錄 什么是 AOP &#xff1f;.Net Core 中 有哪些 AOP 框架&#xff1f;基于 Castle DynamicProxy 實現 AOPIOC中使用 Castle DynamicProxy實現事務管理實現用戶自動填充 什么是 AOP &#xff1f; AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面編程&a…

OpenCV——把YOLO格式的圖片目標截圖,并按目標類別保存

import os import cv2def get_class_folder(catagetory,class_id, base_folder):# 根據類別ID創建文件夾路徑class_folder os.path.join(base_folder, catagetory[int(class_id)])if not os.path.exists(class_folder):os.makedirs(class_folder)return class_folderdef crop_…

VPN是什么?

VPN&#xff0c;全稱Virtual Private Network&#xff0c;即“虛擬私人網絡”&#xff0c;是一種在公共網絡&#xff08;如互聯網&#xff09;上建立加密、安全的連接通道的技術。簡單來說&#xff0c;VPN就像是一條在公共道路上鋪設的“秘密隧道”&#xff0c;通過這條隧道傳輸…

圖像的反轉

圖像顏色的反轉一般分為兩種&#xff1a;一種是灰度圖片的顏色反轉&#xff0c;另一種是彩色圖像的顏色反轉。 本節使用的原圖如下&#xff1a; 1.1 灰度圖像顏色反轉 灰度圖像每個像素點只有一個像素值來表示&#xff0c;色彩范圍在0-255之間&#xff0c;反轉方法255-當前像…

信創產業政策,信創測試方面

信創產業的政策支持主要體現在多個方面&#xff0c;這些政策旨在推動產業的快速發展&#xff0c;加強自主創新能力&#xff0c;保障國家信息安全&#xff0c;以及促進產業結構的優化升級。 首先&#xff0c;政府通過財政支持、稅收優惠等方式&#xff0c;加大對信創產業的資金…

8.ApplicationContext常見實現

ClassPathXmlApplicationContext 基于classpath下xml格式的配置文件來創建 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

Flutter——最詳細(Drawer)使用教程

背景 應用左側或右側導航面板&#xff1b; 屬性作用elevation相當于陰影的大小 import package:flutter/material.dart;class CustomDrawer extends StatelessWidget {const CustomDrawer({Key? key}) : super(key: key);overrideWidget build(BuildContext context) {return…

解決SeaTunnel 2.3.4版本寫入S3文件報錯問題

在使用Apache SeaTunnel時&#xff0c;我遇到了一個寫入S3文件的報錯問題。通過深入調試和分析&#xff0c;找到了問題所在&#xff0c;并提出了相應的解決方案。 本文將詳細介紹報錯情況、參考資料、解決思路以及后續研究方向&#xff0c;希望對大家有幫助&#xff01; 一、…

代碼隨想錄算法訓練營第二天|【數組】977.有序數組的平方

題目 給你一個按 非遞減順序 排序的整數數組 nums&#xff0c;返回 每個數字的平方 組成的新數組&#xff0c;要求也按 非遞減順序 排序。 示例 1&#xff1a; 輸入&#xff1a;nums [-4,-1,0,3,10] 輸出&#xff1a;[0,1,9,16,100] 解釋&#xff1a;平方后&#xff0c;數組…

修改頭文件版本需要修改的文件

以修改ui的頭文件版本為例&#xff0c;還需要同時更新 PJ10PC20240120041_c928\components\master-t5\hikauto\module\app\include PJ10PC20240120041_c928\components\master-t5\hikauto\module\app\include\dsp PJ10PC20240120041_c928\components\master-t5\hikauto\incl…

C# Halcon目標檢測算法

在Halcon中進行目標檢測可以使用傳統的計算機視覺方法&#xff0c;也可以使用深度學習的方法。Halcon提供了豐富的函數庫來處理這些任務&#xff0c;而在C#中使用Halcon&#xff0c;你需要通過Halcon .NET接口。 以下是使用Halcon進行目標檢測的一般步驟&#xff0c;這里我將給…