使用QSettings或QJson保存UI设置?

abd*_*ahS 4 user-interface qt qsettings qjson

保存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();
Run Code Online (Sandbox Code Playgroud)

但是使用JSON可以更简单:

QJsonObject obj;
obj["someKey"] = "blah blah"
...
Run Code Online (Sandbox Code Playgroud)

保存和恢复ui设置的最佳做法是什么?

  • 保存每个键/值QSettings

  • 保存QJson并随后保存QSettings

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

还有其他想法吗?

kef*_*500 6

QSettings代码不会比你的更麻烦QJsonObject,如果你使用的第一个的所有优势的例子.

默认QSettings构造函数:

您只需设置一次应用程序和组织名称:

QApplication::setApplicationName("My Application");
QApplication::setOrganizationName("My Organization");
QSettings::setDefaultFormat(QSettings::IniFormat);
Run Code Online (Sandbox Code Playgroud)

然后只需在代码中的任何位置使用默认QSettings构造函数:

QSettings settings;
settings.setValue("Key", "Value");
Run Code Online (Sandbox Code Playgroud)

小组作为参数:

您可以在不使用beginGroup()/ endGroup()方法的情况下设置密钥的设置组.只需将斜杠分隔的参数传递给value()/ setValue()methods:

settings.setValue("Group/Key", "Value");
Run Code Online (Sandbox Code Playgroud)

存储UI设置:

从您的问题中不清楚您想要保存哪些确切的UI设置,但有两种方便的方法 - QWidget::saveGeometry()QMainWindow::saveState().您可以使用它分别存储窗口几何状态:

QSettings settings;
settings.setValue("ui/geometry", saveGeometry());
settings.setValue("ui/state", saveState());
Run Code Online (Sandbox Code Playgroud)

JSON:

如果你仍然想要设置文件的深度嵌套和层次结构,那么你是对的,你将不得不使用JSON.最方便的方法是使用注册自定义读/写函数QSettings::registerFormat.为什么还是QSettings?本课程的设计考虑了跨平台代码,无需重新发明轮子.

当然,您也可以从头开始编写自己的JSON设置类.但如果在多级设置层次结构中不需要 - 是否值得?

在应用程序设计方面,您可以包含QSettings一个额外的类.在这种情况下,您可以轻松地试验并切换到您自己的JSON读/写实现,而无需触及主代码.

标准系统路径:

在您的示例中,您使用applicationDirPath()存储设置数据.这是保存大多数应用程序设置的不合适的地方(例如,在这种情况下您可能会遇到Windows UAC问题; Unix系统也有这些文件的单独目录).使用操作系统预期的路径来存储应用程序数据.

例如,在Windows上QSettings::setDefaultFormat(QSettings::IniFormat)加上默认范围(UserScope)会将设置存储在%APPDATA%路径中.这也改善了代码的跨平台可移植性.