Qt ini文命名分析和命名规范实例

在 Qt 中使用 QSettings 保存到 .ini 文件时,键名的格式设计非常重要,既要清晰又要适应扩展性需求。以下是一些键名格式建议和设计规则:


1. 键名的基本设计规则

  1. 分层结构(分组)
    使用 /. 表示分层结构,便于逻辑分组和读取。例如:

    • General/Username
    • Display/Resolution/Width
    • Display/Resolution/Height
  2. 统一命名规范
    键名中使用小写字母、数字和 _/ 等分隔符,避免混用大写和其他符号。
    推荐格式

    • 小写+下划线:general/username
    • 小写+斜杠:general/username
    • 小写+点:general.username
  3. 避免冲突
    使用分组名称作为前缀来区分不同模块的设置。例如:

    • network/server/ip
    • network/client/ip

2. 常见键名格式设计

(1) 通用设置

适用于保存简单应用程序设置:

[general]
user_name=user123
language=en
theme=dark
(2) 模块化分组

为不同功能模块分组:

[network/server]
ip=192.168.1.1
port=8080

[network/client]
ip=192.168.1.100
port=9090

3. 结合 Qt 读取和写入键名

QSettings 自动支持分层结构,下面是一些代码示例:

保存数据
#include <QSettings>

void saveSettings() {
    QSettings settings("config.ini", QSettings::IniFormat);
    // 通用设置
    settings.setValue("general/username", "user123");
    settings.setValue("general/language", "en");
}
读取数据
#include <QSettings>
#include <QDebug>

void loadSettings() {
    QSettings settings("config.ini", QSettings::IniFormat);

    // 读取通用设置
    QString username = settings.value("general/username", "default_user").toString();
    QString language = settings.value("general/language", "en").toString();
}

4. 高级键名设计建议

  1. 支持动态添加
    如果 QComboBox 需要保存多项数据,键名可以设计为带索引的格式:

    [combo_data]
    item_0=Option1
    item_1=Option2
    item_2=Option3
    

    代码示例:

    void saveComboBoxItems(QComboBox *comboBox) {
        QSettings settings("config.ini", QSettings::IniFormat);
        settings.beginGroup("combo_data");
    
        for (int i = 0; i < comboBox->count(); ++i) {
            settings.setValue(QString("item_%1").arg(i), comboBox->itemText(i));
        }
    
        settings.endGroup();
    }
    
  2. 分模块存储
    设计键名时,可以为每个逻辑模块分配独立的分组,便于扩展。例如:

    [module1]
    setting_a=value1
    setting_b=value2
    
    [module2]
    setting_c=value3
    setting_d=value4
    
  3. 存储复杂结构
    如果需要存储一个 JSON-like 数据结构,可以将 JSON 字符串存储到键值中:

    [complex_data]
    settings={"key1":"value1","key2":{"subkey":"value2"}}
    

5.“_”命名风格分析

键名使用下划线 (_) 分隔是一个常见的命名方式,具有以下优缺点和适用场景:


优点

1. 跨平台友好
  • 下划线在所有主流文件系统和编程语言中都被支持,避免了大小写敏感性问题或字符冲突。
2. 提高可读性
  • 下划线可以清晰地分隔单词,使键名更容易阅读和理解:
    • user_settings_languageusersettingslanguage 更易读。
    • 特别是对于单词较长或多单词组合的键名,效果尤为显著。
3. 一致性与直观
  • 与许多程序设计语言的变量命名风格一致,例如 C、Python 等使用蛇形命名法(snake_case)。
  • 文件名与代码中的键名更直观地对应,减少出错概率:
[general]
user_name=John
user_age=30
4. 扁平化的键结构

如果配置文件没有多层嵌套结构,使用下划线分隔可以清晰表达层级关系:

user_name=John
user_age=30
display_resolution_width=1920
display_resolution_height=1080

缺点

1. 无法直接表达层级

与使用 /. 不同,下划线本质上是一种平坦结构,难以自然表示多层关系:

# 使用 /
general/user/name=John
general/user/age=30

# 使用下划线
general_user_name=John
general_user_age=30

若键名层级较深,_ 方式可能显得冗长。

2. 可扩展性受限

下划线键名在嵌套配置文件中可能不如分层式表示直观。如果需要在未来增加更多层级,可能需要重新设计键名规则。


对比其他格式

格式优点缺点示例
/ 分隔类似路径表达,清晰分层结构可能与文件路径语义混淆,不适合所有语言general/user/name
. 分隔常用于键值存储或 JSON 风格,易解析可读性稍差,点号在某些语言中有特殊语义general.user.name
_ 分隔易读、无冲突、跨平台友好难以自然表示多层关系general_user_name

建议

  • 如果配置文件是扁平化设计或层级较浅,推荐使用 _ 分隔,保持简单直观。
  • 如果配置文件需要表示复杂嵌套关系,建议采用 /. 表示层级,并在键名的顶层分组下使用 _ 分隔子键。

综合示例

键名扁平化设计

适合小型配置或无需表示复杂结构的场景:

user_name=John
user_age=30
display_resolution_width=1920
display_resolution_height=1080
键名分层结合下划线

适合大型项目,顶层使用分组,子键使用下划线:

[general]
user_name=John
user_age=30

[display_resolution]
width=1920
height=1080

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【3D Slicer】的小白入门使用指南九

定量医学影像临床研究与实践 任务 定量成像教程 定量成像是从医学影像中提取定量测量的过程。 本教程基于两个定量成像的例子构建: - 形态学:缓慢生长肿瘤中的小体积变化 - 功能:鳞状细胞癌中的代谢活动 第1部分:使用变化跟踪模块测量脑膜瘤的小体积变化第2部分:使用PET标…

Visual Studio 圈复杂度评估

VisualStudio自带的有工具 之后就可以看到分析结果

计算机毕业设计 | SpringBoot+vue城镇保障性住房管理 公租房系统(附源码+论文)

1&#xff0c;绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理城镇保障性住房管理系统的相关信…

Cherno OpenGL(28 ~ 33)

批量渲染-介绍 在这里我们将在一个drawcall打包多个几何体。即 batch geometry。 我们在这里将聚焦于2d渲染&#xff0c;我们如何渲染一堆2d的quads或者说rectangles呢&#xff1f; 一种情况是比如一个2d游戏有很多个tile组成&#xff0c;要去渲染这些tile&#xff1b;另一种…

物联网——UNIX时间戳、BKP备份寄存器、RTC时钟

RTC时钟 Unix时间戳 UTC/GMT 时间戳转换 时间戳转换 BKP简介 RTC框图 RTC基本结构 硬件供电电路 RTC操作注意事项 接线图&#xff08;读写备份寄存器和实时时钟&#xff09;

EPANET供水系统水力和水质模拟,管网系统水龄模拟、余氯模拟、消毒副产物模拟、失效分析、弹性分析等

EPANET 是美国环保综述开发的用于供水系统水力和水质模拟的软件工具&#xff0c;可以视作是SWMM模型&#xff08;主要用于排水系统&#xff09;的姊妹软件。它主要用于供水系统的设计、操作和分析&#xff0c;适用于包括城市、工业区和农村地区各种规模的供水系统分析。在水力模…

51单片机基础04 LCD1602时序;Proteus仿真单片机、总线、网络标号等;

目录 一、LCD显示字符 1、写指令 &#xff08;1&#xff09;、LCD状态配置 &#xff08;2&#xff09;、显示开关与光标 2、写数据 &#xff08;1&#xff09;、设置地址 &#xff08;2&#xff09;、设置数据 3、初始化代码 &#xff08;1&#xff09;、初始化流程 …

OceanBase 闪回查询

前言 在OB中&#xff0c;drop表可以通过 回收站 或者 以往的备份恢复来还原单表。当delete数据时&#xff0c;由于delete操作的对象不会进入回收站&#xff0c;此时需要通过闪回查询功能查看delete的数据&#xff0c;以便后续恢复 本次实验版本为 OceanBase 4.2.1.8&#xff0…

小版本大不同 | Navicat 17 新增 TiDB 功能

近日&#xff0c;Navicat 17 迎来了小版本更新。此次版本新增了对 PingCap 公司的 TiDB 开源分布式关系型数据库的支持&#xff0c;进一步拓展了 Navicat 的兼容边界。即日起&#xff0c;Navicat 17 所有用户可免费升级至最新版本&#xff0c;通过 Navicat 工具实现 TiDB 数据库…

SpringBoot开发——SpringBoot3.3 实现停止/重启定时任务

文章目录 一、运行效果二、项目结构三、功能实现1、项目依赖配置(pom.xml)2、配置文件(application.yaml)3、创建 TaskSchedulerProperties 配置类4、定时任务的实现5、任务管理器的实现6、控制器的实现7、启动应用程序类8、视图控制器9、前端页面(Thymeleaf + Bootstrap)…

【大数据技术基础 | 实验十一】Hive实验:新建Hive表

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤&#xff08;一&#xff09;启动Hive&#xff08;二&#xff09;创建表&#xff08;三&#xff09;显示表&#xff08;四&#xff09;显示表列&#xff08;五&#xff09;更改表&#xff08;六&am…

c++ 后端

基础知识 1. 指针、引用2. 数组3. 缺省参数4. 函数重载5. 内联函数6. 宏7. auto8. const9. 类和对象10. 类的6个默认成员函数11. 初始化列表12. this指针13. C/C的区别14. C 三大特性15. 结构体内存对齐规则16. explicit17. static18. 友元类、友元函数19. 内部类20. 内存管理&…

[C++]:C++11(一)

1. 统一列表初始化 1.1 C11 之前的初始化方式 在 C11 标准中&#xff0c;引入了一个非常实用且强大的特性——统一列表初始化&#xff08;Uniform Initialization&#xff09;&#xff0c;它为我们在初始化各种类型的对象时提供了一种统一且方便的语法形式&#xff0c;极大地…

基于的图的异常检测算法OddBall

OddBall异常检测算法出自2010年的论文《OddBall: Spotting Anomalies in Weighted Graphs》&#xff0c;它是一个在加权图(weighted graph)上检测异常点的算法&#xff0c;基本思路为计算每一个点的一度邻域特征&#xff0c;然后在整个图上用这些特征拟合出一个函数&#xff0c…

基于AOA算术优化的KNN数据聚类算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于AOA算术优化的KNN数据聚类算法matlab仿真。通过AOA优化算法&#xff0c;搜索最优的几个特征数据&#xff0c;进行KNN聚类&#xff0c;同时对比不同个数特征下…

【模块一】kubernetes容器编排进阶实战之CoreDNS的介绍与使用

CoreDNS进阶 CoreDNS进阶-简介 DNS组件历史版本有skydns、kube-dns和coredns三个&#xff0c;k8s 1.3版本之前使用skydns&#xff0c;之后的版本到1.17及之间的版本使用kube-dns&#xff0c; 1.18开始目前主要使用coredns&#xff0c;DNS组件用于解析k8s集群中service name所对…

栈Stack和队列Queue

目录 一、栈 &#xff08;1&#xff09;用数组实现 &#xff08;2&#xff09;用单链表实现 &#xff08;3&#xff09;用标注尾结点的单链表实现 &#xff08;4&#xff09;用双向链表实现 2、栈的实际应用 &#xff08;1&#xff09;改变元素的序列 &#xff08;2&am…

ES6标准-Promise对象

目录 Promise对象的含义 Promise对象的特点 Promise对象的缺点 Promise对象的基本用法 Promise对象的简单例子 Promise新建后就会立即执行 Promise对象回调函数的参数 Promise参数不会中断运行 Promise对象的then方法 Promise对象的catch()方法 Promise状态为resolv…

【隐私计算】隐私计算的应用场景探索(大模型隐私计算、隐私数据存储计算、Web3、隐私物联网等)

1. 背景分析 隐私计算作为一种实现“原始数据不出域&#xff0c;可用不可见”的数据流通价值的关键技术&#xff0c;经历了2020-2023年的高光时刻&#xff0c;却在2024年骤然走向低谷。从各种渠道了解到一些业内曾经风光无两的隐私计算公司都有不同程度的裁员。几乎一夜之间&am…

【大数据学习 | flume】flume的概述与组件的介绍

1. flume概述 Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。它将各个服务器中的数据收集起来并送到指定的地方去&#xff0c;比如说送到HDFS、Hbase&#xff0c;简单来说flume就是收集日志的。 Flume两个版本区别&#xff1a; ​ 1&…