QSetting详解

一. QSettings介绍

通常设计应用程序的时候,会希望在应用程序关闭后,记住其设置(窗口大小、位置、选项等)。这些信息通常存储在Windows上的系统注册表中,以及macOS和iOS上的属性列表文件中。在Unix系统上,在没有标准的情况下,许多应用程序(包括KDE应用程序)都使用INI文本文件来保存应用程序的参数设置。Qt提供了QSettings类来支持应用程序的参数保存,利用QSetting,就能够在便携式管理器中保存和恢复应用程序设置。QSettings的APl基于QVariant,能够以最小的工作量保存大多数基于值的类型,如QString ORect和Qlmage。

二. QSettings使用说明

  1. QSettings的初始化
    创建QSettings对象时,必须传递公司或组织的名称以及应用程序的名称。例如,如果产品名为Star Runner,而公司名为MySoft,则需要按如下方式构造QSettings对象:

    QSettings settings("MySoft", "Star Runner");
    

    如果在应用程序中的多个位置使用Q设置,则可能需要使用QCoreApplication:setOrganizationName()QCoreApplication:setApplicationNamel()指定组织名称和应用程序名称,然后使用默认的QSettings钩子函数:

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

    有时希望访问存储在特定文件或注册表路径中的设置。在所有平台上,如果想直接读取INI文件,可以使用QSettings构造函数,该构造函数将文件名作为第一个参数,并将QSettings::IniFormat作为第二个参数。例如:

    QSettings settings("/home/petra/misc/myapp.ini", QSettings::IniFormat);
    
  2. QSettings的参数设置
    每个设置由一个指定设置名称(节和键组成,通过/来分割)的QString和一个存储与密钥相关数据的QVariant组成。使用setValue()函数进行参数的设置。例如:

    settings.setValue("editor/wrapMargin", 68);
    

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

  3. QSettings的参数读取
    通过value()函数读取参数:

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

    如果没有找到指定名称的设置,QSettings将返回一个空的QVariant(可以转换为整数0)。您可以通过向value()传递第二个参数来指定另一个默认值(即使这个参数不存在,也会返回这个默认参数):

    int margin = settings.value("editor/wrapMargin", 80).toInt();
    
  4. QSettings中的参数的查删减
    调用contains()测试给定的键是否存在。调用remove()删除与键关联的设置。调用allKeys()获取所有密钥的列表。调用clear()删除所有键。

  5. 参数名称(键)的命名规则
    设置键可以包含任何Unicode字符。Windows注册表和INI文件使用不区分大小写的键,而macOS和iOS上的CFPreferences API使用区分大小写键。为了避免可移植性问题,请遵循以下简单规则:

    • 始终使用相同的案例引用相同的密钥。例如,如果您在代码中的某个位置将键称为text font,则不要在其他位置将其称为Text Fonts
    • 除大小写外,应避免使用相同的键名。例如,如果您有一个名为MainWindow的键,请不要尝试将另一个键保存为mainwindow
    • 不要在节或关键字名称中使用斜杠(/\);反斜杠字符用于分隔子键(见下文)。在窗口上,\由QSettings转换为/,这使它们完全相同。

    可以使用“/”字符作为分隔符来形成分层键,类似于Unix文件路径。例如:

      settings.setValue("mainwindow/size", win->size());
      settings.setValue("mainwindow/fullScreen", win->isFullScreen());
      settings.setValue("outputpanel/visible", panel->isVisible());
    

    如果要保存或恢复许多具有相同前缀的设置,可以使用beginGroup()指定前缀,并在末尾调用endGroup()。下面是同样的例子,但这次使用的是组机制:

        settings.beginGroup("mainwindow");
        settings.setValue("size", win->size());
        settings.setValue("fullScreen", win->isFullScreen());
        settings.endGroup();
    
        settings.beginGroup("outputpanel");
        settings.setValue("visible", panel->isVisible());
        settings.endGroup();
    
  6. QSettings的线程安全性
    Q设置是可重入的。这意味着可以在不同的线程中同时使用不同的QSettings对象。即使QSettings对象引用磁盘上的相同文件(或系统注册表中的相同条目)。如果通过一个QSettings对象修改了设置,则在同一位置操作并处于同一进程中的任何其他QSettingss对象中都会立即看到更改。只要满足某些条件,就可以从不同的进程(可以是同时运行的应用程序的不同实例,也可以是完全不同的应用程序)安全地使用Q设置来读取和写入相同的系统位置。对于QSettings::IniFormat,它使用咨询文件锁定和智能合并算法来确保数据的完整性。这样做的条件是,可写配置文件必须是一个常规文件,并且必须位于当前用户可以在其中创建新的临时文件的目录中

  7. QSettings保存的配置文件在系统中的存储位置

    • 在Unix系统上,如果文件格式为NativeFormat,则默认使用以下文件(如果未设置XDG_CONFIG_DIRS,则使用/etc/XDG的默认值):

      1. $HOME/.config/MySoft/Star Runner.conf (Qt for Embedded Linux: $HOME/Settings/MySoft/Star Runner.conf)
      2. $HOME/.config/MySoft.conf (Qt for Embedded Linux: $HOME/Settings/MySoft.conf)
      3. for each directory <dir> in $XDG_CONFIG_DIRS: <dir>/MySoft/Star Runner.conf
      4. for each directory <dir> in $XDG_CONFIG_DIRS: <dir>/MySoft.conf
    • 在macOS 10.2和10.3版本上,默认使用以下文件:

      1. $HOME/Library/Preferences/com.MySoft.Star Runner.plist
      2. $HOME/Library/Preferences/com.MySoft.plist
      3. /Library/Preferences/com.MySoft.Star Runner.plist
      4. /Library/Preferences/com.MySoft.plist
    • 在Windows上,NativeFormat设置存储在以下注册表路径中(在Windows上,对于在WOW64模式下运行的32位程序,设置存储在以下注册表路径中:HKEY_LOCAL_MACHINE\Software\WOW6432node。就是应用程序主目录中的Settings/MySoft/StarRunner.conf。):

      1. HKEY_CURRENT_USER\Software\MySoft\Star Runner
      2. HKEY_CURRENT_USER\Software\MySoft\OrganizationDefaults
      3. HKEY_LOCAL_MACHINE\Software\MySoft\Star Runner
      4. HKEY_LOCAL_MACHINE\Software\MySoft\OrganizationDefaults
    • 如果文件格式为IniFormat,则在Unix、macOS和iOS上使用以下文件(如果未设置XDG_CONFIG_DIRS,则使用/etc/XDG的默认值。):

      1. $HOME/.config/MySoft/Star Runner.ini (Qt for Embedded Linux: $HOME/Settings/MySoft/Star Runner.ini)
      2. $HOME/.config/MySoft.ini (Qt for Embedded Linux: $HOME/Settings/MySoft.ini)
      3. for each directory <dir> in $XDG_CONFIG_DIRS: <dir>/MySoft/Star Runner.ini
      4. for each directory <dir> in $XDG_CONFIG_DIRS: <dir>/MySoft.ini

      在Windows上,使用以下文件(FOLDRID_RoamingAppData通常指向C:\Users\UserName\AppData\Roaming,也由环境变量%AppData%显示。FOLDERID_ProgramData通常指向C:\ProgramData。):

      1. FOLDERID_RoamingAppData\MySoft\Star Runner.ini
      2. FOLDERID_RoamingAppData\MySoft.ini
      3. FOLDERID_ProgramData\MySoft\Star Runner.ini
      4. FOLDERID_ProgramData\MySoft.ini
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值