QSettings 是“按平台规范存配置”的桥梁,非简单配置工具;构造方式决定落盘位置与权限,必须选对 scope/format;INI 文件需显式 setIniCodec("UTF-8") 防乱码;分组须用 beginGroup/endGroup 保障键名可靠性;sync() 是崩溃恢复关键,须在关键节点显式调用。

QSettings 不是“保存配置的工具”,而是“把配置按平台规范存到正确地方”的桥梁。直接硬写 setting.ini 到程序目录,Windows 上大概率失败,Linux/macOS 上也不符合规范。
QSettings 构造时选对 scope 和 format 才不白忙
构造方式决定配置最终落盘位置和权限行为,不是随便传个路径就行:
-
QSettings("MyOrg", "MyApp"):自动按平台选存储位置(Windows 注册表HKEY_CURRENT_USER\Software\MyOrg\MyApp,Linux 是~/.config/MyOrg/MyApp.conf),推荐新项目首选 -
QSettings("/path/to/config.ini", QSettings::IniFormat):强制走 INI 文件,但路径必须可写(比如不能写进Program Files或只读安装目录) -
QSettings(QSettings::NativeFormat, QSettings::SystemScope):系统级配置,需要管理员/root 权限,普通用户设置慎用
错误示例:QSettings("./config.ini", QSettings::IniFormat) —— 相对路径在打包后极可能指向错误目录,且没处理权限问题。
setValue 之前记得 setIniCodec("UTF-8")
INI 文件默认用系统本地编码(Windows 是 GBK/GB2312),中文键或值不设编码会乱码或读不出来:
- 必须在
setValue前调用settings.setIniCodec("UTF-8") - 仅对
QSettings::IniFormat有效;注册表和 plist 本身支持 Unicode,无需此步 - 如果已存在乱码文件,改编码后旧数据仍不可读,需引导用户重置或做迁移逻辑
分组写入别漏掉 beginGroup/endGroup
看似只是语法糖,实际影响键名解析和批量操作可靠性:
-
settings.beginGroup("Network")后,setValue("host", "127.0.0.1")等价于写"Network/host",避免手拼字符串出错 - 嵌套分组合法:
beginGroup("Proxy") → beginGroup("Auth") → setValue("user", "...")生成键"Proxy/Auth/user" - 忘记
endGroup()会导致后续所有setValue都被塞进当前 group,调试时极难发现
不推荐手动拼接键名如 "Network/host",尤其当 group 名含斜杠或特殊字符时,beginGroup 会自动处理转义。
sync() 不是可有可无,而是崩溃恢复的关键开关
QSettings 默认延迟写入(缓存+合并),程序异常退出可能导致最新设置丢失:
- 在关键节点(如窗口关闭、设置面板确认)后显式调用
settings.sync() - 不要依赖析构函数自动刷盘 —— 若对象提前释放或进程被强杀,
sync()不会执行 - 频繁调用
sync()会影响性能(尤其 INI 文件大时),建议只在必要时机触发
最易忽略的一点:跨线程使用同一个 QSettings 实例未加锁,sync() 可能覆盖其他线程的未提交修改 —— 多实例场景下,优先用单例封装或确保线程隔离。


















