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

news/2024/11/19 7:12:11/

在 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

http://www.ppmy.cn/news/1548178.html

相关文章

scikit-learn学习Day30

1.数据集划分 import numpy as np from sklearn.datasets import load_iris import pandas as pd arr load_iris() data arr.data target arr.target print(target) n_target target.reshape(len(target),1) print(n_target) n_data np.hstack([data,n_target]) print(n_…

python+Django+MySQL+echarts+bootstrap制作的教学质量评价系统,包括学生、老师、管理员三种角色

项目介绍 该教学质量评价系统基于Python、Django、MySQL、ECharts和Bootstrap技术&#xff0c;旨在为学校或教育机构提供一个全面的教学质量评估平台。系统主要包括三种角色&#xff1a;学生、老师和管理员&#xff0c;每个角色有不同的功能权限。 学生角色&#xff1a;学生可…

BLE 蓝牙客户端和服务器连接

蓝牙通信在设计小型智能设备时非常普遍&#xff0c;之前一直没有使用过&#xff0c;最近使用ardunio ESP32 做了一些实验&#xff0c;做了一个收听播客的智能旋钮&#xff08;Smart Knob&#xff09;&#xff0c;它带有一个旋转编码器和两个按键。 本文介绍BLE 服务器Server和W…

【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;提示词英文模板&#x1f4af;提示词中文解析1. 明确需求2. 建议额外角色3. 角色确认与修改4. 逐步完善提示5. 确定参考资料6. 生成和优化提示7. 生成最终响…

学习threejs,使用AnimationMixer实现变形动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.AnimationMixer 动画…

#define定义宏(2)

大家好&#xff0c;今天给大家分享两个技巧。 首先我们应该先了解一下c语言中字符串具有自动连接的特点。注意只有将字符串作为宏参数的时候才可以把字符串放在字符串中。 下面我们来讲讲这两个技巧 1.使用#&#xff0c;把一个宏参数变成对应的字符串。 2.##的作用 可以把位…

AIGC----生成对抗网络(GAN)如何推动AIGC的发展

AIGC: 生成对抗网络(GAN)如何推动AIGC的发展 前言 随着人工智能领域的迅猛发展&#xff0c;AI生成内容&#xff08;AIGC&#xff0c;AI Generated Content&#xff09;正成为创意产业和技术领域的重要组成部分。在AIGC的核心技术中&#xff0c;生成对抗网络&#xff08;GAN&am…

若依笔记(十):芋道的菜单权限与数据隔离

目录 若依实现 菜单权限 按钮权限 数据隔离 在之前用户权限体系与数据隔离与前后端token鉴权体系中详细地说明了若依是如何实现登录鉴权与登录后菜单/按钮权限控制与数据控制的,本文基于芋道源码+vue3前端(2.2版本)研究它是怎么实现菜单权限控制与数据隔离的; 若依实现…