【问题标题】:What settings storage format to choose?选择什么设置存储格式?
【发布时间】:2010-12-22 04:02:33
【问题描述】:

我正在编写一个 Qt 应用程序,需要存储程序的设置。我希望它们可以被非高级用户轻松编辑,但对高级用户来说足够灵活(因此允许通过其他程序、脚本等轻松进行自动编辑)。 QSettings 确实提供了两种格式,本机格式,对于 Windows 是注册表,以及 INI 格式,对于大多数其他平台是本机格式。 INI 很好,但是在其中看到 @QString(...) 或其他 Qt 内容并不真正可读,而且容易出错。

注册表也不是很好。它的设计初衷不是为了搞乱,因此不太适合编辑或高级使用;它确实解决了跨线程和多个 QSettings 对象的同步问题(因此我不会清除所有内容,尽管我可以只使用一个受读写锁保护的全局对象)。我正在查看 XML,但它非常冗长,并且确实需要编写 QSettings 格式(不是真正的问题)但非常灵活。

我知道 XML 的其他替代品存在,但我并不真正熟悉它们;我当然不想编写解析器,我自己的最终格式是例外,而不是基本的东西。

更新 - 注意: 我根本不会绕过 QSettings,我只会为它编写一个格式 - 看起来它只是两个函数指针(用于读取和写入函数)传递给静态函数,然后我可以使用我的格式。

更新 2: 我也担心 Linux 服务器,它们通常没有 GUI。我希望人们能够通过 nano 或类似的东西从服务器轻松编辑配置,不使用管理器(是的,我将拥有一个守护程序服务器和一个远程 GUI 管理器)。

【问题讨论】:

    标签: xml qt settings format ini


    【解决方案1】:

    查看冗长的另一种方法是内容稳健性。如果出于任何原因(阿尔法粒子轰击磁盘,导致单个位翻转),您仍然可以进入那里并进行必要的纠错......所以有好处,但也有与之相关的成本......二进制文件,一个位错误意味着数据完全丢失

    【讨论】:

    • 确实如此,但在这种情况下可能不是重点。我肯定会担心文档、工作项等的静默数据损坏和手动恢复,但这对于设置存储来说可能不是大问题。
    • 设置问题不大,只是用户手动编辑文件并破坏结构,但可以轻松检查甚至修复(或完全删除/忽略)。
    【解决方案2】:

    我将从通过 .ini 文件进行 QSettings 开始,看看您是否会遇到很多问题。如果没有问题,那么就没有必要寻求 XML 解决方案。如果您最终需要 XML 解决方案,您可以(如前所述)为 QSettings 对象添加格式化程序。

    【讨论】:

      【解决方案3】:

      您可以使用QSettings 类来实现这一点。它是一个抽象类,允许您的应用程序存储其设置,以便在下次启动时检索它们。

      保存设置:

      QSettings settings("ValueName",  "Value");
      

      读取设置:

      QString v = settings.value("ValueName");
      

      【讨论】:

      • 请再次阅读我的问题。我确实知道,并且会使用 QSettings,但我担心底层格式。 QSettings 提供了 INI 格式和 Windows 注册表格式。
      • QSettings 使用关于操作系统的“标准”存储格式。这就是我谈到抽象的原因。此类允许您使用每个系统的标准格式,即使它们不同。这是 Qt 为您的应用程序保存值的方式。除非你想保存复杂的对象,否则不需要自己做。在这种情况下,我认为 XML 是更好的方法。
      • OP 说他希望他的应用程序的用户轻松编辑设置,而不是他想轻松保存设置(因为他已经是)
      【解决方案4】:

      如果由于某种原因您最终绕过 QSettings 并考虑将 XML 用于您的配置文件,我建议您查看 JSON 或 YAST,具体取决于您对可用库的喜好。

      作为旁注,如果您不打算让用户手动编辑文件,只需选择对您来说最简单的内容 (QSettings?) 并继续您的生活,因为格式的选择无关紧要一点点(har har)。

      【讨论】:

      • 我会看看他们,如果我选择eiher,我会看看如何编写QSettings格式。在跨计算机移动时会很重要。文件就像复制文件一样简单。需要将注册表项导出到文件然后导入。如果你给它一个用较新的 regedit 创建的 .reg 文件,regedit 可能会抱怨。
      猜你喜欢
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多