详解Qt QSettings 设置类

文章目录

  • QSettings 详解
    • 前言
    • 什么是 QSettings?
    • QSettings 的构造函数和常用成员函数
      • 构造函数
        • 1. 默认构造函数
        • 2. 指定组织和应用名称
        • 3. 使用自定义文件
    • 常用成员函数
      • 1. 写入设置
        • `setValue`
      • 2. 读取设置
        • `value`
      • 3. 检查键是否存在
        • `contains`
      • 4. 删除设置
        • `remove`
      • 5. 获取所有键
        • `allKeys`
      • 6. 同步数据
        • `sync`
    • 完整示例代码
    • 总结


QSettings 详解

前言

在开发应用程序时,保存用户偏好设置、配置参数或其他小型持久化数据是一个常见需求。例如,记住窗口大小、用户登录状态或程序的语言选项。Qt 提供了 QSettings 类,可以方便地存储和读取这些配置信息。

QSettings 是一个跨平台的解决方案,支持多种存储方式,如注册表(Windows)或文件(INI 文件或类似格式),并且可以处理分层结构的键值对。通过 QSettings,开发者无需关心平台差异即可轻松实现配置管理。


什么是 QSettings?

QSettings 是 Qt 的一个类,专门用于存储和读取持久化的键值对数据。其主要特点包括:

  1. 跨平台支持:在 Windows 上默认使用注册表存储,在 Unix 系统上使用文本文件。
  2. 层次化结构:支持分层的键值对存储,类似 JSON 树结构。
  3. 方便快捷:提供简单的接口,无需手动解析或管理配置文件格式。

典型应用场景包括:

  • 保存用户偏好(如主题、语言、窗口位置等)。
  • 存储小型的应用程序配置。

QSettings 的构造函数和常用成员函数

构造函数

1. 默认构造函数
  • 函数原型

    QSettings(QObject *parent = nullptr);
    
  • 作用
    使用默认位置和格式创建一个 QSettings 对象。

  • 示例代码

    QSettings settings;
    
2. 指定组织和应用名称
  • 函数原型

    QSettings(const QString &organization, const QString &application, QObject *parent = nullptr);
    
  • 作用
    指定组织名称和应用名称,用于确定配置文件的存储路径和命名规则。

  • 参数

    • organization:组织名称,通常是公司名称。
    • application:应用名称。
  • 示例代码

    QSettings settings("MyCompany", "MyApp");
    
3. 使用自定义文件
  • 函数原型

    QSettings(const QString &fileName, Format format, QObject *parent = nullptr);
    
  • 作用
    使用指定文件和格式存储配置。

  • 参数

    • fileName:配置文件路径。
    • format:文件格式,可以是 QSettings::IniFormatQSettings::NativeFormat
  • 示例代码

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

常用成员函数

1. 写入设置

setValue
  • 函数原型

    void setValue(const QString &key, const QVariant &value);
    
  • 作用
    向配置文件写入一个键值对。

  • 参数

    • key:键名,支持分层结构(如 "Window/Size")。
    • value:值,可以是基本类型或复杂类型(如 QVariant 支持的类型)。
  • 示例代码

    QSettings settings("MyCompany", "MyApp");
    settings.setValue("Window/Size", QSize(800, 600));
    settings.setValue("User/Name", "JohnDoe");
    

2. 读取设置

value
  • 函数原型

    QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;
    
  • 作用
    根据键名读取配置值,如果键不存在则返回默认值。

  • 参数

    • key:要读取的键名。
    • defaultValue:如果键不存在时返回的值,默认为空。
  • 返回值
    返回一个 QVariant,包含配置值。

  • 示例代码

    QVariant size = settings.value("Window/Size", QSize(640, 480));
    qDebug() << "Window size:" << size.toSize();
    

3. 检查键是否存在

contains
  • 函数原型

    bool contains(const QString &key) const;
    
  • 作用
    检查指定键是否存在。

  • 返回值
    如果键存在,返回 true;否则返回 false

  • 示例代码

    if (settings.contains("User/Name")) {qDebug() << "Username exists!";
    }
    

4. 删除设置

remove
  • 函数原型

    void remove(const QString &key);
    
  • 作用
    删除指定键及其所有子键。

  • 示例代码

    settings.remove("User/Name");
    qDebug() << "Username removed!";
    

5. 获取所有键

allKeys
  • 函数原型

    QStringList allKeys() const;
    
  • 作用
    返回配置中所有的键名。

  • 示例代码

    QStringList keys = settings.allKeys();
    for (const QString &key : keys) {qDebug() << key;
    }
    

6. 同步数据

sync
  • 函数原型

    void sync();
    
  • 作用
    将内存中的更改强制写入存储介质。

  • 示例代码

    settings.setValue("New/Key", 123);
    settings.sync();  // 确保数据立即写入
    

完整示例代码

以下示例展示了如何使用 QSettings 保存和读取用户配置:

#include <QCoreApplication>
#include <QSettings>
#include <QDebug>
#include <QSize>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 创建 QSettings 对象QSettings settings("MyCompany", "MyApp");// 写入设置settings.setValue("Window/Size", QSize(800, 600));settings.setValue("User/Name", "JohnDoe");// 读取设置QSize windowSize = settings.value("Window/Size", QSize(640, 480)).toSize();QString userName = settings.value("User/Name", "Unknown").toString();qDebug() << "Window size:" << windowSize;qDebug() << "User name:" << userName;// 检查键是否存在if (settings.contains("User/Name")) {qDebug() << "Username exists!";}// 删除键settings.remove("User/Name");// 列出所有键QStringList keys = settings.allKeys();for (const QString &key : keys) {qDebug() << key;}return 0;
}

总结

QSettings 是一个强大、灵活且简单易用的配置管理工具,它为应用程序的配置持久化提供了跨平台的解决方案。无论是保存窗口大小、用户偏好,还是管理复杂的键值对结构,QSettings 都能很好地满足需求。

通过合理地组织和使用 QSettings 的键值结构,可以大大简化配置的存取逻辑,从而提升程序的易维护性和用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32如何接收舵机的控制信号(而不是控制舵机)

看到很多如何stm32用pwm信号控制舵机的文章,老生常谈了 我来写一个stm32接收pwm信号的例子 ,这个pwm信号是用来控制舵机的 背景: 我需要接收航模接收机的,用来控制舵机的pwm信号, 得到这个信号后,做其他事情. 初版代码 pwm.h#ifndef _pwm_H #define _pwm_H#include "s…

RK3588 HDMI2.1电路参考设计原理

RK3588是瑞芯微电子&#xff08;Rockchip&#xff09;旗下的一款高性能应用处理器芯片&#xff0c;采用了ARM的big.LITTLE架构&#xff0c;结合了四个高性能的Cortex-A76核心和四个高效能的Cortex-A55核心。 big.LITTLE技术通过结合高性能的“大核”&#xff08;big cores&…

【大数据学习 | Spark-Core】详解分区个数

RDD默认带有分区的&#xff0c;那么创建完毕rdd以后他的分区数量是多少&#xff1f; 从hdfs读取文件的方式是最正规的方式&#xff0c;我们通过计算原理可以推出blk的个数和分区数量是一致的&#xff0c;本地化计算。 我们可以发现数据的读取使用的是textInputFormat&#xff…

艾体宝干货丨差异解读:IT 和 OT 网络的数据包和网络分析

IT 网络&#xff08;传统网络&#xff09; IT 网络是现代计算的支柱&#xff0c;为数据交换、通信和处理提供了基础设施。典型应用包括 办公网络数据中心云服务互联网连接 这些网络依靠 TCP/IP、DNS 和 HTTP 等标准协议来促进设备之间的通信。通信路径可能随时发生变化&…

AOC显示器915Sw按键失灵维修记

大家好&#xff0c;我是 程序员码递夫 今天给大家分享的是自己维修老古董AOC液晶显示器按键失灵的的过程&#xff0c;实属DIY记录。 1、引子 家里有台老古董的19寸AOC液晶显示器&#xff08;型号915Sw&#xff09;, 一直作为我的副显示器陪伴着左右&#xff0c;显示还正常&a…

Vscode进行Java开发环境搭建

Vscode进行Java开发环境搭建 搭建Java开发环境(Windows)1.Jdk安装2.VsCode安装3.Java插件4.安装 Spring 插件5.安装 Mybatis 插件5.安装Maven环境6.Jrebel插件7.IntelliJ IDEA Keybindings8. 收尾 VS Code&#xff08;Visual Studio Code&#xff09;是由微软开发的一款免费、开…

VSCode打开c#项目报错:DotnetAcquisitionTimeoutError

VSCode打开c#项目&#xff0c;会自动下载.NET环境&#xff0c;下载不了报超时&#xff0c;详情如下&#xff1a; ms-dotnettools.csharp tried to install .NET 8.0.11~x64 but that install had already been requested. No downloads or changes were made. ms-dotnettools.…

【EDA】floorplanning

截自Laung-Terng Wang, Yao-Wen Chang, Kwang-Ting (Tim) Cheng - Electronic Design Automation_ Synthesis, Verification, and Test (Systems on Silicon)-Morgan Kaufmann (2009)中的Chapter 10-Floorplanning 关于本章 这章介绍了floorplanning问题&#xff0c;介绍了两…

【MATLAB源码-第218期】基于matlab的北方苍鹰优化算法(NGO)无人机三维路径规划,输出做短路径图和适应度曲线.

操作环境&#xff1a; MATLAB 2022a 1、算法描述 北方苍鹰优化算法&#xff08;Northern Goshawk Optimization&#xff0c;简称NGO&#xff09;是一种新兴的智能优化算法&#xff0c;灵感来源于北方苍鹰的捕猎行为。北方苍鹰是一种敏捷且高效的猛禽&#xff0c;广泛分布于北…

戴尔 AI Factory 上的 Agentic RAG 搭载 NVIDIA 和 Elasticsearch 向量数据库

作者&#xff1a;来自 Elastic Hemant Malik, Dell Team 我们很高兴与戴尔合作撰写白皮书《戴尔 AI Factory with NVIDIA 上的 Agentic RAG》。白皮书是一份供开发人员参考的设计文档&#xff0c;概述了实施 Agentic 检索增强生成 (retrieval augmented generation - RAG) 应用…

第十六届蓝桥杯模拟赛(第一期)-Python

本次模拟赛我认为涉及到的知识点&#xff1a; 分解质因数 Python的datetime库 位运算 简单dp 1、填空题 【问题描述】 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问 2024 有多少个质因数。 【答案提交】 这是一道结…

统⼀数据返回格式快速⼊⻔

为什么会有统⼀数据返回&#xff1f; 其实统一数据返回是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维。 优点&#xff1a; 1.⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。 2.降低前端程序员和后端程序员的沟通成本&#xff0c;因为所有接⼝都…

数据库中的增删改查操作、聚合函数、内置函数、分组查询

数据库中的增删改查操作、聚合函数、内置函数、分组查询 CRUD简介Create 新增语法示例单⾏数据全列插⼊单⾏数据指定列插⼊多⾏数据指定列插⼊ Retrieve 检索语法⽰例构造数据 Select全列查询指定列查询查询字段为表达式为查询结果指定别名语法⽰例 结果去重查询 Order by 排序…

mongoDB副本集搭建-docker

MongoDB副本集搭建-docker 注&#xff1a;在进行副本集搭建前&#xff0c;请先将服务部署docker环境并正常运行。 #通过--platform指定下载镜像的系统架构 在这我用的是mongo:4.0.28版本 arm64系统架构的mongo镜像 docker pull --platformlinux/arm64 mongo:4.0.2#查看镜像是…

SpringBoot项目部署到云服务器全流程

文章目录 一、前期准备&#xff08;一&#xff09;云服务器选择&#xff08;二&#xff09;本地环境准备&#xff08;三&#xff09;数据库准备&#xff08;若项目需要&#xff09; 二、服务器配置&#xff08;一&#xff09;获取服务器信息&#xff08;二&#xff09;重置实例…

【mongodb】社区版8:改变配置bindip和授权

更改配置 sudo systemctl restart mongod (base) root@k8s-master-pfsrv:/home/zhangbin# sudo tail -n 20 /var/log/mongodb/mongod.log 日志感觉是成功了:{"t":{"$date":"2024-11-19T19:57:47.076+08:00"

如何用通义灵码助力项目开发 | OceanBase obdiag 项目共建实践

本文来自 obdiag 项目共建的用户分享 一、背景 我的数据库探索之旅始于OceanBase。作为一位满怀好奇心的DBA&#xff0c;我内心始终怀揣着对数据库内部运作机制的无尽向往。开源如同一把钥匙&#xff0c;为我们这些求知欲旺盛的“好奇猫”解锁了通往新知的神秘大门。在众多分布…

Java、Android引用类型

Java/Android中有四种引用类型&#xff0c;分别是&#xff1a; Strong reference - 强引用 Soft Reference - 软引用 Weak Reference - 弱引用 Phantom Reference - 虚引用 不同的引用类型有着不同的特性&#xff0c;同时也对应着不同的使用场景。 Strong reference - 强引用…

网络安全,文明上网(2)加强网络安全意识

前言 在当今这个数据驱动的时代&#xff0c;对网络安全保持高度警觉已经成为每个人的基本要求。 网络安全意识&#xff1a;信息时代的必备防御 网络已经成为我们生活中不可或缺的一部分&#xff0c;信息技术的快速进步使得我们对网络的依赖性日益增强。然而&#xff0c;网络安全…

微前端基础知识入门篇(二)

概述 在上一篇介绍了一些微前端的基础知识,详见微前端基础知识入门篇(一)。本文主要介绍qiankun微前端框架的实战入门内容。 qiankun微前端实践 通过Vite脚手架分别创建三个程序,主应用A为:vite+vue3+ts,两个微应用分别为B:vite+vue3+ts;C:vite+React+ts。因为qiankun的…