8

保存 UI 设置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(使用另一种定义组和应用程序的机制)?

还有什么想法吗?

4

1 回答 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(). 您可以使用它分别存储您的窗口几何状态

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

于 2017-02-06T07:55:00.090 回答