使用 QSettings 或 QJson 保存 UI 设置?
Save UI settings with QSettings or QJson?
用 QSettings
保存 UI 设置既麻烦又容易出错,因为每次都必须使用 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
中保存每个key/value?
保存在 QJson
然后用 QSettings
?
保存
仅在 QJson
中保存(使用另一种定义组和应用程序的机制)?
还有其他想法吗?
如果您使用第一个代码的所有优点,QSettings
代码不会比您的 QJsonObject
示例更麻烦。
默认QSettings
构造函数:
您可以设置应用程序和组织名称一次:
QApplication::setApplicationName("My Application");
QApplication::setOrganizationName("My Organization");
QSettings::setDefaultFormat(QSettings::IniFormat);
然后只需在代码中的任意位置使用默认的 QSettings
构造函数 :
QSettings settings;
settings.setValue("Key", "Value");
组作为参数:
无需使用 beginGroup()
/ endGroup()
方法即可设置键的设置组。只需将 slash-delimited 参数传递给 value()
/ setValue()
方法:
settings.setValue("Group/Key", "Value");
正在存储 UI 设置:
从你的问题中不清楚你想要保存哪些 UI 设置,但是有两种方便的方法 – QWidget::saveGeometry()
and QMainWindow::saveState()
. You can use it to store your windows geometry and state 分别为:
QSettings settings;
settings.setValue("ui/geometry", saveGeometry());
settings.setValue("ui/state", saveState());
JSON:
如果您仍然希望设置文件有一些深层嵌套和层次结构,那么您是对的,您将不得不使用 JSON。最方便的方法是使用 QSettings::registerFormat
注册自定义 read/write 函数。为什么还是QSettings
?这个class是考虑cross-platform代码设计的,不需要重新发明轮子
当然,您也可以从头开始编写自己的JSON设置class。但是,如果不需要多级设置层次结构 – 值得吗?
在应用程序设计方面,您可以将 QSettings
包装在额外的 class 中。在这种情况下,您可以轻松地试验并切换到您自己的 JSON read/write 实现,而无需触及主要代码。
标准系统路径:
在您的示例中,您使用 applicationDirPath()
来存储设置数据。这是保存大多数应用程序设置的不合适位置(例如,在这种情况下,您可能会遇到 Windows UAC 问题;Unix 系统也有用于此类文件的单独目录)。使用操作系统指定的路径来存储应用程序数据。
例如,在 Windows QSettings::setDefaultFormat(QSettings::IniFormat)
加上默认范围 (UserScope) 会将设置存储在 %APPDATA%
路径中。这也提高了代码的 cross-platform 可移植性。
用 QSettings
保存 UI 设置既麻烦又容易出错,因为每次都必须使用 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
中保存每个key/value?保存在
QJson
然后用QSettings
? 保存
仅在
QJson
中保存(使用另一种定义组和应用程序的机制)?
还有其他想法吗?
如果您使用第一个代码的所有优点,QSettings
代码不会比您的 QJsonObject
示例更麻烦。
默认QSettings
构造函数:
您可以设置应用程序和组织名称一次:
QApplication::setApplicationName("My Application");
QApplication::setOrganizationName("My Organization");
QSettings::setDefaultFormat(QSettings::IniFormat);
然后只需在代码中的任意位置使用默认的 QSettings
构造函数 :
QSettings settings;
settings.setValue("Key", "Value");
组作为参数:
无需使用 beginGroup()
/ endGroup()
方法即可设置键的设置组。只需将 slash-delimited 参数传递给 value()
/ setValue()
方法:
settings.setValue("Group/Key", "Value");
正在存储 UI 设置:
从你的问题中不清楚你想要保存哪些 UI 设置,但是有两种方便的方法 – QWidget::saveGeometry()
and QMainWindow::saveState()
. You can use it to store your windows geometry and state 分别为:
QSettings settings;
settings.setValue("ui/geometry", saveGeometry());
settings.setValue("ui/state", saveState());
JSON:
如果您仍然希望设置文件有一些深层嵌套和层次结构,那么您是对的,您将不得不使用 JSON。最方便的方法是使用 QSettings::registerFormat
注册自定义 read/write 函数。为什么还是QSettings
?这个class是考虑cross-platform代码设计的,不需要重新发明轮子
当然,您也可以从头开始编写自己的JSON设置class。但是,如果不需要多级设置层次结构 – 值得吗?
在应用程序设计方面,您可以将 QSettings
包装在额外的 class 中。在这种情况下,您可以轻松地试验并切换到您自己的 JSON read/write 实现,而无需触及主要代码。
标准系统路径:
在您的示例中,您使用 applicationDirPath()
来存储设置数据。这是保存大多数应用程序设置的不合适位置(例如,在这种情况下,您可能会遇到 Windows UAC 问题;Unix 系统也有用于此类文件的单独目录)。使用操作系统指定的路径来存储应用程序数据。
例如,在 Windows QSettings::setDefaultFormat(QSettings::IniFormat)
加上默认范围 (UserScope) 会将设置存储在 %APPDATA%
路径中。这也提高了代码的 cross-platform 可移植性。