【Qt之QSetting】介绍及使用

概述

QSettings类提供了一种持久的、与平台无关的应用程序设置存储功能。
用户通常期望一个应用能在不同会话中记住其设置(窗口大小和位置,选项等)。在Windows上,这些信息通常存储在系统注册表中;在macOSiOS上,存储在属性列表文件中;在Unix系统上,由于缺乏标准,许多应用程序(包括KDE应用程序)使用INI文本文件。
QSettings是对这些技术的抽象,在可移植性的基础上,使您能够保存和恢复应用程序设置。它还支持自定义的存储格式。
QSettings的API基于QVariant,允许您以最小的努力保存大多数基于值的类型,如QString、QRect和QImage等。
如果您只需要一个非持久的基于内存的结构,请考虑使用QMap<QString, QVariant>替代。

基本用法

创建QSettings对象时,必须传递您的公司组织的名称以及应用程序的名称。例如,如果您的产品名称为Star Runner,公司名为MySoft,您应该如下构造QSettings对象:

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

可以在堆上(使用new)或栈上创建QSettings对象。构造和销毁QSettings对象非常快速。
如果在应用程序的多个地方使用QSettings,可以使用QCoreApplication::setOrganizationName()QCoreApplication::setApplicationName()来指定组织名称和应用程序名称,然后使用默认的QSettings构造函数:

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

(这里还指定了组织的互联网域。在设置了互联网域的情况下,macOS和iOS会使用互联网域来标识应用程序,而不是组织名称,因为macOS和iOS应用程序通常使用互联网域来标识自己。如果未设置域,将从组织名称派生一个虚假的域。有关详细信息,请参阅下面的特定平台的注释。)
QSettings存储设置。每个设置由一个QString(键)和一个QVariant(关联该键的数据)组成。使用setValue()来写入设置。例如:

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

如果存在具有相同键的设置,新值将覆盖现有值。出于效率考虑,更改可能不会立即保存到永久存储中。(您可以随时调用sync()来提交更改。)
使用value()方法可以获取设置的值:

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

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

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

要测试给定键是否存在,请调用contains()方法。要删除与键关联的设置,请调用remove()方法。要获取所有键的列表,请调用allKeys()方法。要删除所有键,请调用clear()方法。

QVariant和GUI类型

由于QVariantQt Core模块的一部分,因此不能提供转换函数到Qt GUI的数据类型,如QColor、QImage和QPixmap。换句话说,QVariant中没有toColor()、toImage()或toPixmap()等函数。
相反,您可以使用QVariant::value()qVariantValue()模板函数。例如:

QSettings settings("MySoft", "Star Runner");
QColor color = settings.value("DataPump/bgcolor").value<QColor>();

反向转换(例如,从QColor到QVariant)对于QVariant支持的所有数据类型,包括与GUI相关的类型都是自动的:

QSettings settings("MySoft", "Star Runner");
QColor color = palette().background().color();
settings.setValue("DataPump/bgcolor", color);

使用qRegisterMetaType()qRegisterMetaTypeStreamOperators()注册的自定义类型也可以使用QSettings进行存储。

部分和键的语法

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

  1. 始终使用相同的大小写引用相同的键。例如,如果在代码的某个地方将键称为"text fonts",请不要在其他地方将其称为"Text Fonts"
  2. 避免只有大小写不同的键名称。例如,如果有一个名为"MainWindow"的键,请不要使用"mainwindow"保存另一个键。
  3. 不要在部分或键名中使用斜线(‘/‘和’’)。反斜杠字符用于分隔子键(见下文)。在Windows上,‘‘会被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();

如果使用beginGroup()设置了组,大多数函数的行为会相应改变。组可以递归设置。
除了组,QSettings还支持"数组"概念。详细信息请参阅beginReadArray()beginWriteArray()

后备机制

假设您已经创建了一个QSettings对象,组织名称为MySoft,应用程序名称为Star Runner。在查找值时,按照以下顺序搜索最多四个位置:

  1. Star Runner应用程序的特定用户位置
  2. 所有MySoft应用程序的特定用户位置
  3. Star Runner应用程序的系统范围位置
  4. 所有MySoft应用程序的系统范围位置
    (有关Qt支持的不同平台上这些位置的信息,请参阅下面的特定平台的注释。)
    如果在第一个位置找不到键,则继续在第二个位置搜索,依此类推。这使您能够存储系统范围或组织范围的设置,并可以在每个用户或每个应用程序的基础上进行覆盖。要关闭此机制,请调用setFallbacksEnabled(false)。
    虽然可以从四个位置读取所有键,但只有第一个文件(与当前正在处理的应用程序相关的特定用户位置)可以写入。要写入其他文件,请省略应用程序名称和/或指定QSettings::SystemScope(与默认值QSettings::UserScope相对)。
    让我们通过一个示例来看:
QSettings obj1("MySoft", "Star Runner");
QSettings obj2("MySoft");
QSettings obj3(QSettings::SystemScope "MySoft", "Star Runner");
QSettings obj4(QSettings::SystemScope, "MySoft");

下表总结了哪些QSettings对象访问哪些位置。"X"表示该位置是与QSettings对象关联的主位置,用于读取和写入;"o"表示在读取时该位置用作后备。
在这里插入图片描述
这种机制的美妙之处在于它适用于Qt支持的所有平台,并且仍然提供了很大的灵活性,而无需指定任何文件名或注册表路径。
如果您想在所有平台上都使用INI文件而不是本地API,可以将QSettings::IniFormat作为QSettings构造函数的第一个参数,后跟作用域、组织名称和应用程序名称:

QSettings settings(QSettings::IniFormat, QSettings::UserScope,"MySoft", "Star Runner");

Settings Editor示例允许您尝试不同设置位置以及打开或关闭后备机制。

恢复GUI应用程序的状态

QSettings经常用于存储GUI应用程序的状态。下面的示例演示了如何使用QSettings来保存和恢复应用程序主窗口的几何形状。

void MainWindow::writeSettings()
{QSettings settings("Moose Soft", "Clipper");settings.beginGroup("MainWindow");settings.setValue("size", size());settings.setValue("pos", pos());settings.endGroup();
}void MainWindow::readSettings()
{QSettings settings("Moose Soft", "Clipper");settings.beginGroup("MainWindow");resize(settings.value("size", QSize(400, 400)).toSize());move(settings.value("", QPoint(200, 200)).toPoint());settings.endGroup();
}

有关为什么调用QWidget::resize()QWidget::move()而不是QWidget::setGeometry()以恢复窗口的几何形状的讨论,请参阅窗口几何形状。
readSettings()writeSettings()函数必须从主窗口的构造函数和close事件处理程序中调用,如下所示:

MainWindow::MainWindow()
{...readSettings();
}void MainWindow::closeEvent(QCloseEvent *event)
{if (userReallyWantsToQuit()) {writeSettings();event->accept();} else {event->ignore();}
}

有关使用QSettings的自包含示例,请参见Application示例。

同时从多个线程或进程访问设置

QSettings是可重入的。这意味着可以同时在不同的线程中使用不同的QSettings对象。即使这些QSettings对象引用相同的磁盘文件(或系统注册表中的相同条目),此保证仍然有效。如果通过一个QSettings对象修改了一个设置,这个更改将立即对在同一位置操作并且在同一进程中存在的任何其他QSettings对象可见。
可以安全地从不同的进程(可以是同时运行的应用程序的不同实例或完全不同的应用程序)读取和写入相同的系统位置。它使用建议性文件锁定和智能合并算法来确保数据的完整性。请注意,sync()方法会导入其他进程所做的更改(除了写入这个QSettings的更改)。

常用方法

以下是QSettings类的一些常用方法的介绍。

构造函数:

  • QSettings(const QString& organization, const QString& application = QString(), QObject *parent = nullptr)
  • 使用组织名称和应用程序名称创建一个QSettings对象。默认情况下,QSettings使用基于平台的本地存储机制。
    • organization:组织名称
    • application:应用程序名称(可选)
    • parent:父级QObject对象(可选)

读取和写入值:

  • value(const QString& key, const QVariant& defaultValue = QVariant()):读取指定键的值,如果键不存在则返回defaultValue。返回QVariant类型的值。
  • setValue(const QString& key, const QVariant& value):设置指定键的值。
  • remove(const QString& key):删除指定键及其对应的值。
  • clear():清除所有的设置键和值。

设置默认值:

  • setDefaultFormat(QSettings::Format format):为所有新创建的QSettings对象设置默认格式(例如,INI格式或注册表格式)。
  • setDefaultScope(QSettings::Scope scope):为所有新创建的QSettings对象设置默认作用域(用户范围或系统范围)。

读取和写入组:

  • beginGroup(const QString& prefix):开始一个以prefix为前缀的设置组。
  • endGroup():结束当前的设置组。

同步操作:

  • sync():将所有的更改写入到永久存储,确保数据的同步。通常,QSettings会自动定期执行这个操作,但在某些情况下可能需要手动调用。

获取设置信息:

  • fileName():返回与当前QSettings对象关联的文件名。
  • scope():返回当前QSettings对象的作用域(用户范围或系统范围)。
  • organizationName():返回当前QSettings对象的组织名称。
  • applicationName():返回当前QSettings对象的应用程序名称。

注意:QSettings还提供了其他一些方法,例如支持跨线程和进程读写设置,以及对设置键和值进行迭代和查询。

示例

以下是一个使用QSettings的示,包含了常用的成员方法:

#include <QCoreApplication>
#include <QSettings>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建 QSettings 对象QSettings settings("MyCompany", "MyApp");// 设置值settings.setValue("username", "John");settings.setValue("password", "123456");// 获取值QString username = settings.value("username").toString();QString password = settings.value("password").toString();qDebug() << "Username:" << username;qDebug() << "Password:" << password;// 检查是否存在某个键if (settings.contains("username")) {qDebug() << "The 'username' key exists";}// 移除一个键settings.remove("password");// 通过分组设置值,创建一个新的分组settings.beginGroup("Server");settings.setValue("host", "localhost");settings.setValue("port", 8080);settings.endGroup();// 在分组中获取值QString serverHost = settings.value("Server/host").toString();int serverPort = settings.value("Server/port").toInt();qDebug() << "Server Host:" << serverHost;qDebug() << "Server Port:" << serverPort;// 将更改刷新到磁盘上的配置文件中settings.sync();return a.exec();
}

结果

在这里插入图片描述

示例步骤:

  1. 创建了一个名为"MyApp"的应用程序设置,并设置了一些值。
  2. 通过value()方法获取这些值并输出。使用contains()方法检查特定的键是否存在,并使用remove()方法移除了"password"键。
  3. 使用beginGroup()和endGroup()方法创建了一个名为"Server"的分组,并在该分组中设置了一些值。
  4. 通过sync()方法将更改刷新到配置文件中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/120727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins自动化测试

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;可扩展的关键字驱动的自动化测试框架。 它…

修复VS2015没有代码提示的问题【已解决】

问题描述 在Visual Studio 中编写代码时&#xff0c;发现使用库函数的时候&#xff0c;在类对象后输入点后&#xff0c;并没有出现类对应的成员信息的提示。 解决过程 1&#xff09;方法1&#xff1a; 百度“vs 没有代码提示”&#xff0c;搜索解决方案。 方案1&#xff1…

lossBN

still tips for learning classification and regression关于softmax的引入和作用分类问题损失函数 - MSE & Cross-entropy⭐Batch Normalization&#xff08;BN&#xff09;⭐想法&#xff1a;直接改error surface的landscape&#xff0c;把山铲平feature normalization那…

Qt 实现侧边栏滑出菜单效果

1.效果图 2.实现原理 这里做了两个widget&#xff0c;一个是 展示底图widget&#xff0c;一个是 展示动画widget。 这两个widget需要重合。动画widget需要设置属性叠加到底图widget上面&#xff0c;设置如下属性&#xff1a; setWindowFlags(Qt::FramelessWindowHint | Qt::…

Java提升技术,进阶为高级开发和架构师的路线

原文网址&#xff1a;Java提升技术&#xff0c;进阶为高级开发和架构师的路线-CSDN博客 简介 Java怎样提升技术&#xff1f;怎样进阶为高级开发和架构师&#xff1f;本文介绍靠谱的成长路线。 首先点明&#xff0c;只写业务代码是无法成长技术的。提升技术的两个方法是&…

【Docker】Docker-Compose内置DNS负载均衡失效问题

Docker Compose实现负载均衡 还是对前面的例子docker-compose.yml稍微修改&#xff1a; version: "3.8"services:flask-demo:build:context: .dockerfile: Dockerfileimage: flask-demo:latestenvironment:- REDIS_HOSTredis-server- REDIS_PASS${REDIS_PASS}healt…

jmeter报Java.NET.BindException: Address already in use: connect

1、windows10和window11上&#xff1a; 修改注册表的内容&#xff1a; HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters&#xff1a; 新建dword&#xff08;值&#xff09;的类型&#xff1a; MaxUserPort 65334 TcpTimedWaitDelay 30window

Android Glide限定onlyRetrieveFromCache取内存缓存submit超时阻塞方式,Kotlin

Android Glide限定onlyRetrieveFromCache取内存缓存submit超时阻塞方式,Kotlin import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import com.b…

Chimera:混合的 RLWE-FHE 方案

参考文献&#xff1a; [HS14] S. Halevi and V. Shoup. Algorithms in HElib. In Advances in Cryptology–CRYPTO 2014, pages 554–571. Springer, 2014.[HS15] S. Halevi and V. Shoup. Bootstrapping for HElib. In Advances in Cryptology–EUROCRYPT 2015, pages 641–6…

K8s概念汇总-笔记

目录 1.Master 1.1在Master上运⾏着以下关键进程 2.什么是Node? 1.2在每个Node上都运⾏着以下关键进程 3.什么是 Pod ? 4. 什么是Label &#xff1f; 5.Replication Controller 6.Deployment 6.1Deployment的典型场景&#xff1a; 7.Horizontal Pod Autoscaler TODO…

【MATLAB源码-第57期】基于matlab的IS95前向链路仿真,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 IS-95&#xff0c;也被称为cdmaOne&#xff0c;是第一代的CDMA&#xff08;Code Division Multiple Access&#xff0c;码分多址&#xff09;数字蜂窝通信标准。IS-95的全称是Interim Standard-95&#xff0c;最初由Qualcomm…

春运压力如何破?V2X技术来解题

近日&#xff0c;国务院发布了2024春节放假方案。春节作为每年中国交通运输系统最繁忙的时期&#xff0c;车流的快速增长带来了道路运载压力和事故风险率。如果想拥有一个不堵车又平安的春节&#xff1f;那就不得不提V2X 技术&#xff0c;以及它在提升交通安全与交通效率、助力…

TVRNet网络PyTorch实现

文章目录 文章地址网络各层结构代码实现 文章地址 An End-to-End Traffic Visibility Regression Algorithm文章通过训练搜集得到的真实道路图像数据集&#xff08;Actual Road dense image Dataset, ARD&#xff09;&#xff0c;通过专业的能见度计和多人标注&#xff0c;获得…

图像语义分割 pytorch复现DeepLab v1图像分割网络以及网络详解(骨干网络基于VGG16)

图像语义分割 pytorch复现DeepLab v1图像分割网络以及网络详解&#xff08;骨干网络基于VGG16&#xff09; 背景介绍2、 网络结构详解2.1 LarFOV效果分析 2.2 DeepLab v1-LargeFOV 模型架构2.3 MSc&#xff08;Multi-Scale&#xff0c;多尺度(预测)&#xff09;2.3 以VGG16为特…

1-多媒体通信概述

文章目录 媒体和多媒体媒体多媒体VarityIntergrationInteraction 多媒体通信(MMC)业务类型 MMC主要问题和关键技术主要问题关键技术 MMC发展动向重要事件趋势 标准化组织 媒体和多媒体 媒体 承载信息的载体. 感知媒体, 表示媒体, 显示媒体, 存储媒体, 传输媒体. 多媒体 Var…

电脑定时关机

电脑定时关机 1.右键 管理 2. 3. 4. 5. shutdown.exe/s /f /t 06.点击完成就好了 7.这里面可以 看到定时任务和启动 右键有运行 结束 禁用

世微 宽电压降压 DC-DC 电源管理芯片 以太网平衡车工业控制电源驱动12V6A AP8854

1&#xff0c;产品描述 AP8854 一款宽电压范围降压型 DC-D 电源管理芯片&#xff0c;内部集成使能开关控制、基 准电源、误差放大器、过热保护、限流保 护、短路保护等功能&#xff0c;非常适合宽电压输 入降压使用。 AP8854 带使能控制&#xff0c;可以大大节省外 围器件&…

广州华锐互动:VR虚拟现实物理学习平台,开启数字化教学新格局

随着虚拟现实(VR)技术的不断发展&#xff0c;越来越多的领域开始应用这一技术。广州华锐互动开发的VR虚拟现实物理学习平台就得到了广泛应用&#xff0c;平台涉及力学、光学、热学等初中物理知识&#xff0c;还包含了物理名人、实验器具、物理现象的还原和学习&#xff0c;相比…

CSS色域、色彩空间、CSS Color 4新标准 | 京东云技术团队

引言 近期&#xff0c;三大主流浏览器引擎均发布最新版本&#xff0c;支持W3C的CSS Color 4标准&#xff0c;包含新的取色方法color()和相应语法&#xff0c;可展示更多的色域及色彩空间&#xff0c;这意味着web端能展示更丰富更高清的色彩。虽然目前只有最新版本的现代浏览器…

java时间解析生成定时Cron表达式工具类

Cron表达式工具类CronUtil 构建Cron表达式 /****方法摘要&#xff1a;构建Cron表达式*param taskScheduleModel*return String*/public static String createCronExpression(TaskScheduleModel taskScheduleModel){StringBuffer cronExp new StringBuffer("");if(…