当前位置: 首页 > article >正文

Qt的window注册表读写以及删除

Qt的window注册表读写以及删除

  • 1. 使用 `QSettings`(Qt推荐方式)
    • 基本操作
    • 关键点
    • 限制
  • 2. 调用Windows原生API
    • 示例:创建/读取键值
    • 常用API
    • 注意事项
  • 3. 高级场景
    • (1) 递归删除键
    • (2) 注册表权限修改
  • 4. 安全性建议
  • 总结
  • 其他QT文章推荐

在Qt中操作Windows注册表通常需要通过Windows原生API(如 RegOpenKeyExRegSetValueEx等)或Qt的封装工具(如 QSettings)。以下是详细的方法和示例:


1. 使用 QSettings(Qt推荐方式)

QSettings 是Qt提供的跨平台配置管理类,在Windows下会自动操作注册表,无需直接调用API。

基本操作

#include <QSettings>
#include <QDebug>// 写入注册表(HKEY_CURRENT_USER\Software\MyApp)
QSettings settings("HKEY_CURRENT_USER\\Software\\MyApp", QSettings::NativeFormat);
settings.setValue("Version", "1.0");
settings.setValue("Settings/Theme", "Dark");// 读取注册表
QString version = settings.value("Version").toString();
QString theme = settings.value("Settings/Theme").toString();
qDebug() << "Version:" << version << "Theme:" << theme;// 删除键
settings.remove("Settings/Theme");

关键点

  • 根键路径:
    • HKEY_CURRENT_USER\\Software\\...(用户级配置)
    • HKEY_LOCAL_MACHINE\\Software\\...(系统级配置,需管理员权限)
  • 格式:
    • QSettings::NativeFormat:使用系统原生格式(Windows注册表)。
    • QSettings::IniFormat:写入INI文件(跨平台兼容)。

限制

  • 无法直接操作非标准注册表路径(如设备驱动键)。
  • 复杂操作(如权限修改)需借助Windows API。

2. 调用Windows原生API

如果需要更底层的控制(如操作任意注册表键、设置权限),需直接使用Windows API。

示例:创建/读取键值

#include <windows.h>
#include <QDebug>void writeRegistry() {HKEY hKey;LPCSTR subKey = "Software\\MyApp";DWORD value = 42;// 创建或打开键if (RegCreateKeyExA(HKEY_CURRENT_USER, subKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) {// 写入DWORD值RegSetValueExA(hKey, "MyValue", 0, REG_DWORD, (BYTE*)&value, sizeof(value));RegCloseKey(hKey);}
}void readRegistry() {HKEY hKey;LPCSTR subKey = "Software\\MyApp";DWORD value;DWORD size = sizeof(value);if (RegOpenKeyExA(HKEY_CURRENT_USER, subKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {if (RegQueryValueExA(hKey, "MyValue", NULL, NULL, (LPBYTE)&value, &size) == ERROR_SUCCESS) {qDebug() << "Read value:" << value;}RegCloseKey(hKey);}
}

常用API

函数作用
RegOpenKeyEx打开注册表键
RegCreateKeyEx创建或打开键
RegSetValueEx设置键值
RegQueryValueEx查询键值
RegDeleteKey删除键
RegCloseKey关闭键句柄

注意事项

  • 权限问题:操作 HKEY_LOCAL_MACHINE 可能需要管理员权限。
  • 字符串类型:
    • REG_SZ:普通字符串(LPCSTRLPCWSTR)。
    • REG_DWORD:32位整数。
  • Unicode支持:
    使用 RegOpenKeyExWLPCWSTR 处理宽字符(推荐)。

3. 高级场景

(1) 递归删除键

Windows API未提供直接删除整个子树的函数,需递归操作:

#include <windows.h>
#include <QDebug>void deleteRegistryKey(HKEY hRoot, LPCWSTR subKey) {HKEY hKey;if (RegOpenKeyExW(hRoot, subKey, 0, KEY_READ | KEY_WRITE, &hKey) != ERROR_SUCCESS) {return;}// 枚举并删除子键WCHAR childKeyName[256];DWORD childKeySize = sizeof(childKeyName);while (RegEnumKeyExW(hKey, 0, childKeyName, &childKeySize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {deleteRegistryKey(hKey, childKeyName);childKeySize = sizeof(childKeyName);}RegCloseKey(hKey);RegDeleteKeyW(hRoot, subKey);
}

(2) 注册表权限修改

使用 RegGetKeySecurityRegSetKeySecurity 调整键的访问权限(需 SECURITY_DESCRIPTOR 知识)。


4. 安全性建议

  1. 最小权限原则:避免滥用 KEY_ALL_ACCESS
  2. 备份关键键:操作前导出注册表(.reg 文件)。
  3. 虚拟化重定向:
    在64位系统上,32位程序访问 HKEY_LOCAL_MACHINE\Software 会被重定向到 HKEY_LOCAL_MACHINE\Software\WOW6432Node。可通过 KEY_WOW64_64KEYKEY_WOW64_32KEY 标志指定路径。

总结

方法适用场景优缺点
QSettings简单键值存储,跨平台兼容易用,但功能有限
Windows API复杂操作(权限、子树删除)功能全面,需处理底层细节

根据需求选择合适方案,优先使用 QSettings 以减少平台依赖代码。

其他QT文章推荐

1. QT开发环境安装以配置。
2. QT线段画板实战
3. 半小时玩转QT桌面系统托盘(含托盘消息)
4. QT入门开发一个时钟
5. 半小时教你做大转盘游戏(QT篇)
6. 手把手教你制作【带吸附效果的线段绘制】(QT)
7. 手把手教你开发-滚动效果号码抽奖(QT)
8. 100行代码实现贪吃蛇小游戏
9.C++实现《扫雷》游戏(入门经典)
10. svg转图片工具开发
11. Qt网路与通信(获取本机网络信息)
12. Qt网路与通信(UDP客户与服务)
13. Qt网络与通信(TCP聊天室)
14. Qt多线程以及线程池
15. Qt散点图、折线图、柱状图、盒须图、饼状图、雷达图开发实例
16. 取色器(QT)
17. MQTT客户端入门开发
18.QT文件上传带进度条实例(含源码)
19. Qt音乐播放器开发实例(可毕设含源码)

相关文章:

Qt的window注册表读写以及删除

Qt的window注册表读写以及删除 1. 使用 QSettings&#xff08;Qt推荐方式&#xff09;基本操作关键点限制 2. 调用Windows原生API示例&#xff1a;创建/读取键值常用API注意事项 3. 高级场景(1) 递归删除键(2) 注册表权限修改 4. 安全性建议总结其他QT文章推荐 在Qt中操作Windo…...

聊一聊接口测试时遇到上下游依赖时该如何测试

目录 一、手工测试时的处理方法 1.1沟通协调法 1.2模拟数据法 二、自动化测试时的处理方法 2.1 数据关联法&#xff08;变量提取&#xff09; 2.2 Mock数据法 2.3自动化框架中的依赖管理 三、实施示例&#xff08;以订单接口测试为例&#xff09; 3.1Mock依赖接口&…...

C++ 排序(1)

以下是一些插入排序的代码 1.插入排序 1.直接插入排序 // 升序 // 最坏&#xff1a;O(N^2) 逆序 // 最好&#xff1a;O(N) 顺序有序 void InsertSort(vector<int>& a, int n) {for (int i 1; i < n; i){int end i - 1;int tmp a[i];// 将tmp插入到[0,en…...

【有啥问啥】深入浅出讲解 Teacher Forcing 技术

深入浅出讲解 Teacher Forcing 技术 在序列生成任务&#xff08;例如机器翻译、文本摘要、图像字幕生成等&#xff09;中&#xff0c;循环神经网络&#xff08;RNN&#xff09;以及基于 Transformer 的模型通常采用自回归&#xff08;autoregressive&#xff09;的方式生成输出…...

zk基础—zk实现分布式功能

1.zk实现数据发布订阅 (1)发布订阅系统一般有推模式和拉模式 推模式&#xff1a;服务端主动将更新的数据发送给所有订阅的客户端。 拉模式&#xff1a;客户端主动发起请求来获取最新数据(定时轮询拉取)。 (2)zk采用了推拉相结合来实现发布订阅 首先客户端需要向服务端注册自己关…...

mySQL数据库和mongodb数据库的详细对比

以下是 MySQL 和 MongoDB 的详细对比&#xff0c;涵盖优缺点及适用场景&#xff1a; 一、核心特性对比 特性MySQL&#xff08;关系型数据库&#xff09;MongoDB&#xff08;文档型 NoSQL 数据库&#xff09;数据模型结构化表格&#xff0c;严格遵循 Schema灵活的文档模型&…...

ubuntu wifi配置(命令行版本)

1、查询当前设备环境的wifi列表 nmcli dev wifi list2、连接wifi nmcli dev wifi connect "MiFi-SSID" password "Password" #其中MiFi-SSID是wifi的密码&#xff0c;Password是wifi的密码3、查看连接情况 nmcli dev status...

Docker与Kubernetes在ZKmall开源商城容器化部署中的应用

ZKmall开源商城作为高并发电商系统&#xff0c;其容器化部署基于DockerKubernetes技术栈&#xff0c;实现了从开发到生产环境的全流程标准化与自动化。以下是核心应用场景与技术实现&#xff1a; 一、容器化基础&#xff1a;Docker镜像与微服务隔离 ​服务镜像标准化 ​分层构建…...

华为AI-agent新作:使用自然语言生成工作流

论文标题 WorkTeam: Constructing Workflows from Natural Language with Multi-Agents 论文地址 https://arxiv.org/pdf/2503.22473 作者背景 华为&#xff0c;北京大学 动机 当下AI-agent产品百花齐放&#xff0c;尽管有ReAct、MCP等框架帮助大模型调用工具&#xff0…...

MYSQL数据库语法补充

一&#xff0c;DQL基础查询 DQL&#xff08;Data Query Language&#xff09;数据查询语言&#xff0c;可以单表查询&#xff0c;也可以多表查询 语法&#xff1a; select 查询结果 from 表名 where 条件&#xff1b; 特点&#xff1a; 查询结果可以是&#xff1a;表中的字段…...

Elasticsearch单节点安装手册

Elasticsearch单节点安装手册 以下是一份 Elasticsearch 单节点搭建手册&#xff0c;适用于 Linux 系统&#xff08;如 CentOS/Ubuntu&#xff09;&#xff0c;供学习和测试环境使用。 Elasticsearch 单节点搭建手册 1. 系统要求 操作系统&#xff1a;Linux&#xff08;Cent…...

在Windows搭建gRPC C++开发环境

一、环境构建 1. CMake Download CMake 2. Git Git for Windows 3. gRPC源码 git clone -b v1.48.0 https://github.com/grpc/grpc 进入源码目录 cd grpc 下载依赖库 git submodule update --init 二、使用CMake生成工程文件 三、使用vs2019编译grpc库文件 四、使用…...

[Python] 企业内部应用接入钉钉登录,端内免登录+浏览器授权登录

[Python] 为企业网站应用接入钉钉鉴权&#xff0c;实现钉钉客户端内自动免登授权&#xff0c;浏览器中手动钉钉授权登录两种逻辑。 操作步骤 企业内部获得 开发者权限&#xff0c;没有的话先申请。 访问 钉钉开放平台-应用开发 创建一个 企业内部应用-钉钉应用。 打开应用…...

编程题学习

acwing 826. 单链表 #include <iostream>using namespace std;const int N 100010;int idx, e[N], ne[N], head;void init() {head -1;idx 0; }void insert_head(int x) {e[idx] x;ne[idx] head;head idx ; }void delete_k_pos(int x, int k) {e[idx] x;ne[idx…...

Dev C++单个源文件和项目两种编程方式介绍

Dev C单个源文件和项目两种编程方式介绍 Dev-C 是一款免费、开源的 C/C 集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为初学者和中级程序员设计&#xff0c;具有简单易用、功能丰富等特点。 Dev C 支持单文件编程和项目编程两种方式。它们之间的主要区别在于如何组…...

用AbortController取消事件绑定

视频教程 React - &#x1f914; Abort Controller 到底是什么神仙玩意&#xff1f;看完这个视频你就明白了&#xff01;&#x1f4a1;_哔哩哔哩_bilibili AbortController的好处之一是事件绑定的函数已无需具名函数,匿名函数也可以被取消事件绑定了 //该代码2秒后点击失效…...

解决:Fontconfig head is null, check your fonts or fonts configurat

文章目录 问题解决方案安装字体依赖包强制刷新字体缓存验证是否生效 个人简介 问题 在使用 Java 环境部署或运行图形相关应用时&#xff0c;比如图片验证码&#xff0c;偶尔会遇到如下报错&#xff1a; Fontconfig head is null, check your fonts or fonts configurat意味当…...

this指针 和 类的继承

一、this指针 Human类的属性fishc与Human&#xff08;&#xff09;构造器的参数fishc同名&#xff0c;但却是两个东西。使用this指针让构造器知道哪个是参数&#xff0c;哪个是属性。 this指针&#xff1a;指向当前的类生成的对象 this -> fishc fishc当前对象&#xff08;…...

无锡无人机驾驶证培训费用

无锡无人机驾驶证培训费用&#xff0c;随着科技的迅速发展&#xff0c;无人机在众多行业中发挥着举足轻重的作用。从影视制作到农业监测&#xff0c;再到物流运输与城市规划&#xff0c;无人机的应用场景不断扩展&#xff0c;因此越来越多的人开始意识到学习无人机驾驶技能的重…...

反向查询详解以Django为例

以下给出两张表格 class User(AbstractUser):mobilemodels.CharField(max_length11,default0,uniqueTrue,verbose_name手机号)email_activemodels.BooleanField(defaultFalse,verbose_name邮箱验证状态)default_address models.ForeignKey(Address, related_nameusers, nullT…...

我们如何思考AI创业投资

&#x1f3ac; Verdure陌矣&#xff1a;个人主页 &#x1f389; 个人专栏: 《C/C》 | 《转载or娱乐》 &#x1f33e; 种完麦子往南走&#xff0c; 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ 声明&#xff1a;本文作者转载&#xff0c;原文出自…...

详解在 MySQL 中建索引时的注意事项

MySQL 中建索引时的注意事项 1. 索引的必要性与设计2. 复合索引与列顺序3. 索引数量与维护4. 索引类型选择5. 特殊注意事项 1. 索引的必要性与设计 使用场景&#xff1a;优先为在 WHERE、JOIN、ORDER BY 和 GROUP BY 中频繁使用的列创建索引。合理的索引设计能显著提升查询效率…...

LabVIEW 中数字转字符串常用汇总

在 LabVIEW 编程环境里&#xff0c;数字与字符串之间的转换是一项极为基础且重要的操作&#xff0c;广泛应用于数据处理、显示、存储以及设备通信等多个方面。熟练掌握数字转字符串的方法和技巧&#xff0c;对编写高效、稳定的程序起着关键作用。接下来&#xff0c;我们将全面深…...

蓝桥杯 C/C++ 组历届真题合集速刷(二)

一、0ASC - 蓝桥云课 &#xff08;单位换算&#xff09;算法代码&#xff1a; #include <iostream> using namespace std; int main() {printf("%d",L);return 0; } 二、0时间显示 - 蓝桥云课 &#xff08;单位换算&#xff09;算法代码&#xff1a; #inclu…...

【接口自动化_数据格式与类型】

在HTTP接口的自动化测试中&#xff0c;请求的数据格式和内容类型是两个密切相关但又有所区别的概念。以下是它们的分类和详细说明&#xff1a; 一、数据格式 数据格式是指请求体&#xff08;Body&#xff09;中数据的组织方式&#xff0c;常见的数据格式有以下几种&#xff1…...

JavaScript/React中,...(三个连续的点)被称为 扩展运算符(Spread Operator) 或 剩余运算符(Rest Operator)

const processOrder (order) > {const tax order.total * 0.1;const finalAmount order.total tax;return { ...order, tax, finalAmount }; }; 解释一下&#xff0c;特别&#xff1a;...?在JavaScript/React中&#xff0c;...&#xff08;三个连续的点&#xff09;被称…...

网络带宽测速工具选择指南iperf3 nttcp tcpburn jperf使用详解

简介 本文主要介绍内网&#xff08;局域网&#xff09;与外网&#xff08;互联网&#xff09;的网络带宽测速工具下载地址、选择指南、参数对比、基本使用。 测速工具快速选择指南 测速工具下载地址 iperf 官网下载链接&#xff1a;iperf.fr/iperf-download.php该链接提供了不…...

源代码保密解决方案

背景分析 随着各行各业业务数据信息化发展&#xff0c;各类产品研发及设计等行业&#xff0c;都有关乎自身发展的核心数据&#xff0c;包括业务数据、源代码保密数据、机密文档、用户数据等敏感信息&#xff0c;这些信息数据有以下共性&#xff1a; — 属于核心机密资料&…...

网络安全小知识课堂(十二)

SQL 注入&#xff1a;一行代码如何毁掉整个数据库&#xff1f; 引言 想象一下&#xff1a;用户在一个搜索框中输入关键词&#xff0c;网站却突然崩溃&#xff0c;所有数据被清空 —— 这不是电影情节&#xff0c;而是 **SQL 注入攻击&#xff08;SQL Injection&#xff09;**…...

PyCharm使用Flask启动项目后,如何修改文件,开启启动加载或是热启动,不用重启项目,直接生效。

PyCharm使用Flask启动项目后&#xff0c;每次修改完文件比如html、py文件都要重启项目才生效&#xff0c;在测试时很不方便&#xff0c;如何设置热启动&#xff0c;修改完文件后直接生效了&#xff1f; 解决方法 1、app.py文件&#xff0c;设置debugTrue。开启调试模式。 开…...