使用QSettings
保存用户界面设置既麻烦又有问题,因为每次您必须使用setValue()
和value()
功能,并且还要定义可能有大错误的组,应用程序名称和组织应用:
QSettings settings(qApp->applicationDirPath() + "/" + qApp->applicationName() + ".ini" , QSettings::IniFormat) ...
settings.beginGroup("someGroup");
settings.setValue("someKey", "blah blah");
QString str = settings.value("someKey");
settings.endGroup();
但是使用JSON可以更简单:
QJsonObject obj;
obj["someKey"] = "blah blah"
...
保存和恢复ui设置的最佳做法是什么?
将每个键/值保存在QSettings
?
保存在QJson
,然后使用QSettings
保存?
仅保存在QJson
中(使用其他机制来定义组和应用程序)?
还有其他想法吗?
答案 0 :(得分:6)
如果您使用第一个代码的所有好处,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设置,但有两种方便的方法 - QWidget::saveGeometry()
和QMainWindow::saveState()
。您可以使用它分别存储您的窗口geometry和state:
QSettings settings;
settings.setValue("ui/geometry", saveGeometry());
settings.setValue("ui/state", saveState());
如果你仍然想要为你的设置文件做一些深度嵌套和层次结构,那么你是对的,你将不得不使用JSON。最方便的方法是使用QSettings::registerFormat
注册自定义读/写函数。为什么还要QSettings
?本课程的设计考虑了跨平台代码,无需重新发明轮子。
当然,您也可以从头开始编写自己的JSON设置类。但如果在多级设置层次结构中没有必要 - 它值得吗?
在应用程序设计方面,您可以将QSettings
包装在另一个类中。在这种情况下,您可以轻松地试验并切换到您自己的JSON读/写实现,而无需触及主代码。
在您的示例中,您使用applicationDirPath()
存储设置数据。这是保存大多数应用程序设置的不合适的地方(例如,在这种情况下您可能会遇到Windows UAC问题; Unix系统也有这些文件的单独目录)。使用操作系统预期的路径来存储应用程序数据。
例如,在Windows QSettings::setDefaultFormat(QSettings::IniFormat)
上加上默认范围(UserScope)会将设置存储在%APPDATA%
路径中。这也改善了代码的跨平台可移植性。