Qt - QSettings实现用户偏好保存

短小的目录

  • 前言
  • QSettings
    • 创建
    • 存储格式
    • 保存&读取
    • 存储位置
    • 跨平台注意事项
    • 自定义存储格式
  • Demo

前言

之前在 Android 开发的时候,也有用到用户偏好保存,当时用的是 SharedPreferences

数据最终会被存储为 xml文件,里面存放的是键值对。Qt 也有类似的类,即 QSettings

QSettings

建议先阅读一遍文档 :Qt文档 - QSettings

根据文档所述,QSettings 是一个 平台无关类。之前在 Qt - 跨平台程序打包发布 中提到过Qt跨平台的实现。不了解这个概念的小伙伴可以去看一看。

Qt - QSettings实现用户偏好保存_第1张图片

创建

//最简,NativeFormat
QSettings settings("MySoft", "Star Runner");

//ini文件
QSettings settings("/home/petra/misc/myapp.ini",
                   QSettings::IniFormat);
//plist文件
QSettings settings("/Users/petra/misc/myapp.plist",
                   QSettings::NativeFormat);
                   

QSettings对象可以在 堆栈 上创建(即使用 new)。构造和销毁QSettings对象`非常快。

存储格式

QSettings 存储的文件格式有:

  • NativeFormat

    使用最适合平台的存储格式存储设置。

    在Windows上,指的是 系统注册表

    在macOS和iOS上,这意味着 CFPreferences API

    在Unix上,即 INI格式的文本配置文件

  • Registry32Format

    仅限Windows:显式访问 32位系统注册表

    在32位Windows上或从64位Windows上的32位应用程序中,其作用与指定NativeFormat相同。

  • Registry64Format

    仅限Windows:显式访问 64位系统注册表

    在32位Windows上或在64位Windows上的64位应用程序中,此操作与指定NativeFormat相同。

  • IniFormat

    将设置存储在 INI文件 中。

    注意:从INI文件读取设置时 不会保留类型信息。所有值将作为 QString 返回。

  • InvalidFormat
    自定义类型;registerFormat() 返回的特殊值。

小结:用户偏好信息,在Windows中此信息通常存储在 系统注册表 中,在macOS和iOS上则存在 属性列表文件 .qlist 中。在Unix系统上,在没有标准的情况下,许多应用程序(包括KDE应用程序)都使用 INI文本文件

QSettings 的 API 基于QVariant(可戳),我们可以使用大多数的类型,例如QString,QRect和QImage。

QSettings存储文件都由一个 QString 和一个 QVariant 组成,该 QString 指定 设置的名称(键),QVariant 存储 与键相关的数据。存储时调用 setValue() 即可。

保存&读取

保存使用的是 setValue()

关于键名,Windows注册表和INI文件使用不区分大小写的键,而macOS和iOS上的CFPreferences API 使用区分大小写的键。

为避免可移植性问题,Qt团队建议遵循以下规则:

  • 始终使用相同的大小写引用相同的键。

  • 请避免使用相同的键名(不区分大小写)。

  • 不要在键名中使用斜杠(“ /”和“ \”);反斜杠字符用于分隔子键。在Windows上,QSettings将“ \”转换为“ /”,从而使它们相同。

我们可以使用’/'字符作为分隔符来形成分层键,类似于 Unix文件路径

	settings.setValue(("mainwindow/size", win->size());());

如果要保存或恢复许多具有相同前缀的设置,可以采用 组机制。用 beginGroup() 指定前缀,结束时调用 endGroup()

注意

  • 如果已经存在具有相同键的设置,则现有值将被新值覆盖。
  • 为了提高效率,更改由事件循环按固定间隔自动保存至永久存储,所以可能不会立即更新到永久存储中。 若想立刻更新,可调用sync()手动提交更改。

读取使用的是 value()

当使用 value()找不到键值时,将返回一个空的QVariant;当然我们也可以在使用value()时传入第二个参数作为 默认值

void MainWindow::writeSettings()
{
   
    QSettings 

你可能感兴趣的:(Qt,Qt,QSettings,保存用户设置)