QSettings 无法正确处理包含斜杠的key

本文最后更新于:2024年6月22日 晚上

前情提要

um,这次长话短说好吧

Qt中,我们经常会用QSettings来读写配置文件,注册表等

‘\‘:二义性

一般情况下没有什么问题,但是当key中包含反斜杠('\') or 斜杠( '/')的时候,就寄了

文档:不要在节名或键名中使用斜杠(“/”和“\”);反斜杠字符用于分隔子键(见下文)。在 Windows 上,“\”被 QSettings 转换为“/”,这使得它们相同

1
settings.setValue("mainwindow/size", win->size());

斜杠被用于分割子键,所以当key本身含有斜杠时(如:"C:\App\test.exe" in MuiCache),QSettings无法处理

  • 可能被认为是分割符
  • 或者被转换为"C:/App/test.exe"(我遇到了)(找了好久bug 哭)

(这其中的逻辑还没有非常搞清楚:为什么路径不会被认为是分割符 而是产生了一个"C:/App/test.exe"这样的key

文档:

请注意,如前所述,QSettings 使用反斜杠字符来分隔子项。因此,您无法读取或写入包含斜杠或反斜杠的 Windows 注册表项;

如果需要,您应该使用本机 Windows API

文档中说分割使用反斜杠('\'),但是代码例子中用的是斜杠( '/'),有点迷糊

总结:

  • 分割子键使用:斜杠( '/'
  • key中包含'\' or '/'(如 路径),就不要用QSettings了,改用Windows API - RegOpenKeyEx
  • 注意,我说的是key,not value,值中包含斜杠没有问题

peace

Ref

Qt - QSettings (class) zh (runebook.dev)

C/C++ 实现Windows注册表操作 - lyshark - 博客园 (cnblogs.com)


QSettings 无法正确处理包含斜杠的key
https://mrbeancpp.github.io/2024/06/22/QSettings-无法正确处理包含斜杠的key/
作者
MrBeanC
发布于
2024年6月22日
许可协议