使用QSettings或QJson保存UI设置?

9

使用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中保存每个键/值?

  • 先在QJson中保存,然后再用QSettings保存?

  • 只在QJson中保存(使用另一种机制定义组和应用程序)?

还有其他想法吗?

1个回答

10

如果你充分利用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()。您可以使用它们分别来存储窗口的geometrystate

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%路径中存储设置。这也提高了您的代码的跨平台可移植性。


1
在您所描述的“JSON”标题下,我不确定使用registerFormat是否明智。您将编写自定义代码以反序列化为QSettings :: SettingsMap目标(请参见ReadFunc的签名),这会遇到OP引用的同样尴尬的问题。 - amoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接