如果您使用第一个代码的所有好处,QSettings 代码不会比您的 QJsonObject 示例更麻烦。
默认QSettings构造函数:
您可以设置应用程序和组织名称一次:
QApplication::setApplicationName("My Application");
QApplication::setOrganizationName("My Organization");
QSettings::setDefaultFormat(QSettings::IniFormat);
然后只需在代码中的任何位置使用默认的QSettings 构造函数:
QSettings settings;
settings.setValue("Key", "Value");
分组作为参数:
无需使用beginGroup() / endGroup() 方法即可设置密钥的设置组。只需将斜杠分隔的参数传递给value() / setValue() 方法:
settings.setValue("Group/Key", "Value");
存储 UI 设置:
从您的问题中不清楚您要保存哪些确切的 UI 设置,但是有两种方便的方法 - QWidget::saveGeometry() 和 QMainWindow::saveState()。您可以使用它来分别存储您的窗口geometry 和state:
QSettings settings;
settings.setValue("ui/geometry", saveGeometry());
settings.setValue("ui/state", saveState());
JSON:
如果您仍然希望设置文件有一些深层嵌套和层次结构,那么您是对的,您将不得不使用 JSON。最方便的方法是使用QSettings::registerFormat 注册自定义读/写函数。为什么还是QSettings?这个类是考虑跨平台代码设计的,不需要重新发明轮子。
当然,您也可以从头开始编写自己的 JSON 设置类。但是,如果在多级设置层次结构中不需要 - 是否值得?
在应用程序设计方面,您可以将QSettings 包装在一个附加类中。在这种情况下,您可以轻松地试验并切换到您自己的 JSON 读/写实现,而无需接触主代码。
标准系统路径:
在您的示例中,您使用applicationDirPath() 来存储设置数据。这是为大多数应用程序保留设置的不合适的地方(例如,在这种情况下,您可能会遇到 Windows UAC 问题;Unix 系统也有用于此类文件的单独目录)。使用操作系统指定的路径来存储应用程序数据。
例如,在 Windows 上,QSettings::setDefaultFormat(QSettings::IniFormat) 加上默认范围 (UserScope) 会将设置存储在 %APPDATA% 路径中。这也提高了代码的跨平台可移植性。