Qt | 本地存储配置信息 QSettings

362 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

前言:

很多时候我们的程序需要在本地保留一些用户的配置或数据信息,方便下次启动程序的时候使用上次的数据信息,这就用到了QSettings。

QSettings支持应用程序能够跨会话记住它的设置。在Windows上,这些信息通常存储在系统注册表中,在macOS和iOS上则存储在属性列表文件中。在Unix系统中,在没有标准的情况下,许多应用程序(包括KDE应用程序)使用INI文本文件。

QSettings的API基于QVariant,允许你方便的保存大多数基于值的类型,如QString, QRect和QImage等。

我就是在开发一个浏览器小程序的下载功能时试用到了这个类。我需要记录浏览器下载的记录,下次启动浏览器时,需要加载下载记录并显示出来。

QSettings的使用:

创建settings:

  • 在创建QSettings对象时,必须传递公司或组织的名称以及应用程序的名称用以区别不同程序的QSettings。例如,如果你的产品叫Star Runner,你的公司叫MySoft,构造QSettings对象时应该如下:
QSettings settings("MySoft", "Star Runner");
  • QSettings对象既可以在堆栈上创建(上面的创建方式),也可以在堆上创建(即使用new)。构造和销毁一个QSettings对象非常快。

  • 如果你在应用程序的很多地方使用QSettings,你可以使用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName()来指定组织名称和应用名称,然后直接使用默认的QSettings构造函数创建一个QSettings。方法如下:

QCoreApplication::setOrganizationName("MySoft");
QCoreApplication::setOrganizationDomain("mysoft.com");
QCoreApplication::setApplicationName("Star Runner");
      ...
QSettings settings;

添加/修改一条setting:

  • QSettings仓库中每个setting由一个QString类型的key和一个存储与key相关的QVariant类型的value组成。要编写一个设置,可以使用setValue()。例如:
settings.setValue("editor/wrapMargin", 68);

如果已经存在具有相同键的设置,则现有值将被新值覆盖。为了提高效率,更改可能不会立即保存到永久存储中。(你可以随时调用sync()来提交你的修改。)

获取setting对应的值:

  • 你可以使用value()来获取设置的值:
int margin = settings.value("editor/wrapMargin").toInt();

如果没有指定名称的设置,QSettings返回一个空QVariant(可以转换为整数0)。你可以通过传递第二个参数给value()来指定另一个默认值(即,当没有指定名称时应该返回的值):

int margin = settings.value("editor/wrapMargin", 80).toInt();

其他:

  • 要判断给定键是否存在,可以调用contains()。
  • 要删除与键相关的setting,可以调用remove()。
  • 要获取所有键的列表,可以调用allKeys()。
  • 要删除所有键,可以调用clear()。