【问题标题】:Save UI settings with QSettings or QJson?使用 QSettings 或 QJson 保存 UI 设置?
【发布时间】:2017-06-22 23:15:30
【问题描述】:

使用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"
...

保存和恢复用户界面设置的最佳做法是什么?

  • 将每个键/值保存在QSettings

  • 保存在QJson,然后用QSettings保存?

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

还有什么想法吗?

【问题讨论】:

    标签: qt user-interface qsettings qjson


    【解决方案1】:

    如果您使用第一个代码的所有好处,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% 路径中。这也提高了代码的跨平台可移植性。

    【讨论】:

    • 如果您在“JSON”标题下描述,我不确定使用registerFormat 是否明智。您将编写自定义代码以反序列化为 QSettings::SettingsMap 目标(请参阅 ReadFunc 的签名),这会遇到 OP 引用的相同尴尬。
    猜你喜欢
    • 2011-05-11
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 2015-04-20
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多