Qt开发:nativeEvent事件的使用
文章目录
- 一、概述
- 二、nativeEvent 的定义
- 三、Windows 平台示例
- 三、使用nativeEvent监测设备变化
一、概述
Qt 的 nativeEvent 是一个特殊的事件处理机制,允许开发者处理操作系统级别的原生事件。通常,Qt 通过 QEvent 机制来管理事件,但有时我们需要直接处理底层的原生事件,例如 Windows 消息(Windows API)、X11 事件(Linux)、macOS 事件等。
二、nativeEvent 的定义
nativeEvent 是 QCoreApplication 和 QApplication 提供的一个虚函数:
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)virtual bool nativeEvent(const QByteArray &eventType, void *message, qintptr *result);
#elsevirtual bool nativeEvent(const QByteArray &eventType, void *message, long *result);
#endif
该函数在 Qt 事件循环中会被调用,用于拦截操作系统原生事件。
参数解析:
- eventType:事件类型,例如 Windows 下通常是 “windows_generic_MSG” 或"windows_dispatcher_MSG"。
- message:指向操作系统事件的指针。例如,在 Windows 下,它是 MSG*。
- result:用于返回处理结果(可选)。
返回值:
- true:表示事件已被处理,不需要传递给 Qt 继续处理。
- false:表示事件未被处理,Qt 仍然会继续处理它。
三、Windows 平台示例
在 Windows 上,message 其实是 MSG*,可以用来拦截特定的 Windows 消息,比如 WM_HOTKEY(全局热键)。
#include <QApplication>
#include <QDebug>
#include <QWidget>
#include <windows.h>
class MyWidget : public QWidget {
protected:bool nativeEvent(const QByteArray &eventType, void *message, long * result) override {if (eventType == "windows_generic_MSG") {MSG *msg = static_cast<MSG *>(message);if (msg->message == WM_HOTKEY) {qDebug() << "Hotkey Pressed!";return true; // 表示事件已处理}}return QWidget::nativeEvent(eventType, message, result);}public:MyWidget() {// 注册全局热键:Ctrl + Alt + HRegisterHotKey((HWND)winId(), 1, MOD_CONTROL | MOD_ALT, 'H');}~MyWidget() {UnregisterHotKey((HWND)winId(), 1);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyWidget w;w.show();return app.exec();
}
输出结果:

三、使用nativeEvent监测设备变化
1. WM_DEVICECHANGE 的基本定义
WM_DEVICECHANGE 是 Windows 操作系统提供的一个系统消息(System Message),用于通知应用程序系统中设备(如 USB 设备、存储设备、网卡等)发生了变化。例如,当插入或移除 USB 设备时,系统会发送 WM_DEVICECHANGE 消息。
在 Windows.h 头文件中,WM_DEVICECHANGE 的定义如下:
#define WM_DEVICECHANGE 0x0219
当某个设备发生变化时,Windows 会向所有顶级窗口(包括 Qt 窗口)发送 WM_DEVICECHANGE 消息。该消息的 wParam 参数表示具体的设备变化类型,常见的值如下:

其中,DBT_DEVICEARRIVAL 和 DBT_DEVICEREMOVECOMPLETE 是最常见的,用于检测 USB 设备插拔。
2. Qt 中拦截 WM_DEVICECHANGE 事件
#include <QApplication>
#include <QWidget>
#include <QDebug>
#include <windows.h>
#include <dbt.h>class DeviceMonitorWidget : public QWidget {
protected:bool nativeEvent(const QByteArray &eventType, void *message, long *result) override {if (eventType == "windows_generic_MSG") {MSG *msg = reinterpret_cast<MSG*>(message);if (msg->message == WM_DEVICECHANGE) {PDEV_BROADCAST_HDR pHdr = reinterpret_cast<PDEV_BROADCAST_HDR>(msg->lParam);PDEV_BROADCAST_VOLUME pVolume = reinterpret_cast<PDEV_BROADCAST_VOLUME>(pHdr);if (msg->wParam == DBT_DEVICEARRIVAL) {if (pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME) {if (pVolume->dbcv_flags == 0) {qDebug() << "U Disk inserted";//获取当前系统的盘符QFileInfoList fileList = QDir::drives();QString strPath;for (int i = 0; i < fileList.count(); i++) {strPath = fileList[i].filePath();qDebug() << "strPath:" << strPath;const wchar_t *w_usb = reinterpret_cast<const wchar_t*>(strPath.utf16());UINT iRet = GetDriveType(w_usb);if (iRet == DRIVE_REMOVABLE) {qDebug() << "it's a U Disk," << "Name:" << strPath;}}}} } else if (msg->wParam == DBT_DEVICEREMOVECOMPLETE) {if (pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME) {if (pVolume->dbcv_flags == 0) {qDebug() << "Pull out the U Disk";}}}}}return QWidget::nativeEvent(eventType, message, result);}public:DeviceMonitorWidget() {setWindowTitle("设备监视器");resize(300, 200);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);DeviceMonitorWidget w;w.show();return app.exec();
}相关文章:
Qt开发:nativeEvent事件的使用
文章目录 一、概述二、nativeEvent 的定义三、Windows 平台示例三、使用nativeEvent监测设备变化 一、概述 Qt 的 nativeEvent 是一个特殊的事件处理机制,允许开发者处理操作系统级别的原生事件。通常,Qt 通过 QEvent 机制来管理事件,但有时…...
鸿蒙Next-应用检测、安装以及企业内部商店的实现
一、企业内部应用检测和更新升级 A应用检测是否安装B应用 canOpenApp():boolean{ try { let link schB://com.example.test/open; // 替换成你目标应用的link串儿 let canOpen bundleManager.canOpenLink(link); console.log("canOpen:"canOpen…...
存量思维和增量思维
在网上看一篇文章,有两种典型的阅读方式。 一种,是挑刺式,眼里只有缺点。 比如,有人不厌其烦地告诉作者,哪段有错别字,哪段不够严谨。 闲得蛋疼。 有这工夫,多看会书,不香么&…...
golang将大接口传递给小接口以及场景
文章目录 golang将大接口传递给小接口背景什么是大接口传递给小接口使用场景 golang将大接口传递给小接口 背景 在 Go 语言中,接口是一种强大的工具,它允许我们定义对象的行为而不关心其具体实现。特别是在复杂的应用程序中,将一个实现了较…...
K8s 1.27.1 实战系列(七)Deployment
一、Deployment介绍 Deployment负责创建和更新应用程序的实例,使Pod拥有多副本,自愈,扩缩容等能力。创建Deployment后,Kubernetes Master 将应用程序实例调度到集群中的各个节点上。如果托管实例的节点关闭或被删除,Deployment控制器会将该实例替换为群集中另一个节点上的…...
Swift系列02-Swift 数据类型系统与内存模型
Swift 是一门现代的、安全的编程语言,其类型系统和内存模型设计对性能和安全性有着重要影响。本文将深入探讨 Swift 的数据类型系统与内存模型,帮助你更好地理解并利用这些特性来优化你的 iOS 应用。本文主要包含: 值类型和引用类型…...
MySQL中like模糊查询如何优化?
大家好,我是锋哥。今天分享关于【MySQL中like模糊查询如何优化?】面试题。希望对大家有帮助; MySQL中like模糊查询如何优化? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中,LIKE 模糊查询虽然非常常见,…...
用低代码平台集成人工智能:无需专业开发也能实现智能化
引言:人工智能的普及与企业需求 随着人工智能(AI)技术的飞速发展,越来越多的企业开始意识到其在提升运营效率、优化客户体验和推动业务创新方面的巨大潜力。从智能客服到自动化决策支持,从数据分析到个性化推荐&#x…...
【使用hexo模板创建个人博客网站】
使用hexo模板创建个人博客网站 环境准备node安装hexo安装ssh配置 使用hexo命令搭建个人博客网站hexo命令 部署到github创建仓库修改_config.yml文件 编写博客主题扩展 环境准备 node安装 进入node官网安装node.js 使用node -v检查是否安装成功 安装成功后应该出现如上界面 …...
最简单圆形进度条实现CSS+javascript,两端带圆弧
两端是弧形的圆形进度条。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title…...
vuejs 模板语法、条件渲染、v-for、事件处理、表单输入绑定
创建vue项目之后我们就可以开始写代码了,我们的代码一般都会写在src目录-components目录-HelloWord.vue文件内。 我们之前写的HTML文件的结构是HTML代码可以集成或者连接外部的css/js文件。 我们通过vue建立的项目,它的结构是在一个vue文件内集成了HTML…...
论文阅读方法
文章目录 步骤一:对论文进行自我判断阅读题目和关键词。阅读摘要阅读总结要点 步骤二:阅读文章阅读图表和图表的注释阅读引言阅读实验部分阅读结果和作者对结果的讨论(创新点)要点 步骤三:精度论文回答问题1回答问题2回…...
问题解决:Kali Linux 中配置启用 Vim 复制粘贴功能
在 Kali Linux 系统中,使用 XShell 或其他类似终端时,Vim 编辑器的默认设置并不支持直接进行复制和粘贴操作,这对于日常的开发工作或渗透测试人员来说可能会造成不便。幸运的是,通过简单的配置调整,可以让 Vim 轻松支持…...
Linux hexdump命令
hexdump 是 Linux 中一个强大的二进制文件查看工具,可以用于查看文件的十六进制、ASCII 或其他格式的转储内容。以下是常见用法及示例: 1. 查看文件头部(前 N 个字节) 语法 hexdump -n <字节数> -C <文件名>示例&am…...
Stable Diffusion教程|快速入门SD绘画原理与安装
什么是Stable Diffusion,什么是炼丹师?根据市场研究机构预测,到2025年全球AI绘画市场规模将达到100亿美元,其中Stable Diffusion(简称SD)作为一种先进的图像生成技术之一,市场份额也在不断增长&…...
系统架构设计师—系统架构设计篇—微服务架构
文章目录 概述优势挑战 概述 微服务是一种架构风格,将单体应用划分成一组小的服务,服务之间相互协作,实现业务功能,每个服务运营在独立的进程中,服务间采用轻量级的通信机制协作(通常是HTTP/JSON࿰…...
Array and string offset access syntax with curly braces is deprecated
警告信息 “Array and string offset access syntax with curly braces is deprecated” 是 PHP 中的一个弃用警告(Deprecation Notice),表明在 PHP 中使用花括号 {} 来访问数组或字符串的偏移量已经被标记为过时。 背景 在 PHP 的早期版本…...
腾讯元宝:AI 时代的快速论文阅读助手
1. 背景与需求 在 AI 研究领域,每天都会涌现大量学术论文。如何高效阅读并提取关键信息成为研究者的一大难题。腾讯元宝是腾讯推出的一款大模型,结合了**大语言模型(LLM)和自然语言处理(NLP)**技术&#x…...
基于单片机的风速报警装置设计
标题:基于单片机的风速报警装置设计 内容:1.摘要 本设计聚焦于基于单片机的风速报警装置,旨在解决传统风速监测缺乏实时报警功能的问题。采用单片机作为核心控制单元,结合风速传感器采集风速数据。经实验测试,该装置能准确测量 0 - 60m/s 范…...
1998-2022年各地级市第一产业占GDP比重/地级市第一产业占比数据(市辖区)
1998-2022年各地级市第一产业占GDP比重/地级市第一产业占比数据(市辖区) 1、时间:1998-2022年 2、指标:地级市第一产业占GDP比重/地级市第一产业占比 3、来源:城市统计年鉴 4、范围:299个地级市 5、缺…...
使用HIP编写GPU 算子向量加法
HIP (Heterogeneous-compute Interface for Portability) 来编写一个 GPU 算子(operator)。HIP 是 AMD 推出的 GPU 编程接口,类似 CUDA,但可在 AMD 和 NVIDIA GPU 上运行。下面我给你一个完整示例,演示如何写一个简单算…...
Kali Linux 新手速成:Docker 部署实战与靶场环境一键构建
1. Kali Linux与Docker的黄金组合 刚接触网络安全的朋友们,肯定对Kali Linux不陌生。这个专为安全测试设计的操作系统,就像是一把瑞士军刀,集成了各种强大的工具。但今天我要分享的是一个更高效的玩法——用Docker来部署漏洞靶场。 为什么说这…...
dingtalk-openclaw-connector:打通钉钉与AI的插件化连接器架构解析
1. 项目概述:一个打通钉钉与AI能力的“连接器”如果你正在企业内部尝试部署AI应用,比如一个能自动处理工单的智能客服,或者一个能帮你分析周报的智能助手,那么你大概率会遇到一个核心难题:如何让AI能力无缝融入员工每天…...
终极指南:5分钟掌握Illustrator批量替换神器ReplaceItems.jsx,效率提升20倍
终极指南:5分钟掌握Illustrator批量替换神器ReplaceItems.jsx,效率提升20倍 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 如果你正在寻找能够大幅提升Adob…...
RAG系统评估实战:使用renumics-rag进行量化分析与性能优化
1. 项目概述:一个为RAG应用量身定制的开源评估工具如果你正在构建或优化一个基于检索增强生成(RAG)的系统,那么你大概率会遇到一个核心痛点:如何科学、量化地评估它的好坏?是看它回答得“像不像人”&#x…...
深圳市2026年打造人工智能先锋城市项目扶持计划申请指南
本项目扶持计划下设十个项目类别,均采用事后奖补类支持方式。1、申报单位需同时满足基础申报条件和专项申报条件。基础申报条件如下:(一)申报单位为在深圳市内(含深汕特别合作区)从事生产经营活动ÿ…...
COMSOL声学建模实战:从无源特征频率到有源辐射边界
1. COMSOL声学建模基础:从理论到实践 声学建模在工程领域应用广泛,无论是建筑声学设计、噪声控制还是音频设备开发,都需要对声波传播特性有深入理解。COMSOL Multiphysics作为一款强大的多物理场仿真软件,提供了完整的声学建模解决…...
5分钟快速上手COLA架构:构建清晰分层的企业级应用完整指南
5分钟快速上手COLA架构:构建清晰分层的企业级应用完整指南 【免费下载链接】COLA 🥤 COLA: Clean Object-oriented & Layered Architecture 项目地址: https://gitcode.com/gh_mirrors/col/COLA COLA(Clean Object-oriented &…...
从数据库设计到前端展示:一条龙搞定Java BigDecimal精度问题(附Spring Boot配置建议)
从数据库设计到前端展示:全面解决Java BigDecimal精度问题实战指南 在电商系统开发中,价格计算是核心业务逻辑之一。一个简单的折扣计算可能引发连锁反应:用户输入0.66折,数据库存储为float类型,Java读取后乘以10却得到…...
长期使用Taotoken聚合API对项目运维复杂度的简化感受
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken聚合API对项目运维复杂度的简化感受 作为项目维护者,我们团队在过去一段时间里,将多个大模…...
