如果你充分利用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%
路径中存储设置。这也提高了您的代码的跨平台可移植性。
registerFormat
是否明智。您将编写自定义代码以反序列化为QSettings :: SettingsMap
目标(请参见ReadFunc
的签名),这会遇到OP引用的同样尴尬的问题。 - amoe