Qt之Gui的事件转换

QGuiApplication的实现类QGuiApplicationPrivate方法processWindowSystemEvent处理window系统事件

static void processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent *e);

在QWindowSystemInterface的处理事件方法中会调用上面的processWindowSystemEvent方法

flushWindowSystemEvents发送消息
QT_DEFINE_QPA_EVENT_HANDLER
定义为

#define QT_DEFINE_QPA_EVENT_HANDLER(ReturnType, HandlerName, ...) \template Q_GUI_EXPORT ReturnType QWindowSystemInterface::HandlerName<QWindowSystemInterface::DefaultDelivery>(__VA_ARGS__); \template Q_GUI_EXPORT ReturnType QWindowSystemInterface::HandlerName<QWindowSystemInterface::SynchronousDelivery>(__VA_ARGS__); \template Q_GUI_EXPORT ReturnType QWindowSystemInterface::HandlerName<QWindowSystemInterface::AsynchronousDelivery>(__VA_ARGS__); \template<typename Delivery> ReturnType QWindowSystemInterface::HandlerName(__VA_ARGS__)

QGuiApplication初始化时会加载QGeneralPlugin

  • 键盘对应 QEvdevKeyboardPlugin,创建QEvdevKeyboardManager
QEvdevMouseManager::QEvdevMouseManager(const QString &key, const QString &specification, QObject *parent): QObject(parent), m_x(0), m_y(0), m_xoffset(0), m_yoffset(0)
{Q_UNUSED(key);QString spec = QString::fromLocal8Bit(qgetenv("QT_QPA_EVDEV_MOUSE_PARAMETERS"));if (spec.isEmpty())spec = specification;auto parsed = QEvdevUtil::parseSpecification(spec);m_spec = std::move(parsed.spec);for (const QStringRef &arg : qAsConst(parsed.args)) {if (arg.startsWith(QLatin1String("xoffset="))) {m_xoffset = arg.mid(8).toInt();} else if (arg.startsWith(QLatin1String("yoffset="))) {m_yoffset = arg.mid(8).toInt();}}// add all mice for devices specified in the argument listfor (const QString &device : qAsConst(parsed.devices))addMouse(device);if (parsed.devices.isEmpty()) {qCDebug(qLcEvdevMouse, "evdevmouse: Using device discovery");if (auto deviceDiscovery = QDeviceDiscovery::create(QDeviceDiscovery::Device_Mouse | QDeviceDiscovery::Device_Touchpad, this)) {// scan and add already connected keyboardsconst QStringList devices = deviceDiscovery->scanConnectedDevices();for (const QString &device : devices)addMouse(device);connect(deviceDiscovery, &QDeviceDiscovery::deviceDetected,this, &QEvdevMouseManager::addMouse);connect(deviceDiscovery, &QDeviceDiscovery::deviceRemoved,this, &QEvdevMouseManager::removeMouse);}}QInputDeviceManager *manager = QGuiApplicationPrivate::inputDeviceManager();connect(manager, &QInputDeviceManager::cursorPositionChangeRequested, [this](const QPoint &pos) {m_x = pos.x();m_y = pos.y();clampPosition();});
}

addMouse会创建QEvdevMouseHandler打开设备,并且根据文件描述符创建QSocketNotifier注册到事件分发器中
将QEvdevMouseHandler的鼠标信号与QEvdevMouseManager对应的槽函数建立联系,信号触发时,对应的槽函数会调用,执行QWindowSystemInterface的事件处理函数,将事件转化为QEvent

  • 鼠标对应 QEvdevMousePlugin

QPA

qt的平台抽象,window实现代码在plugins/platforms/window下
判断window的事件函数为

QtWindows::WindowEventType windowEventType(UINT message, WPARAM wParam, LPARAM lParam);

QWindowsContext的windowsProc处理事件,其实现类为QWindowsContextPrivate

struct QWindowsContextPrivate {QWindowsContextPrivate();unsigned m_systemInfo = 0;QSet<QString> m_registeredWindowClassNames;HandleBaseWindowHash m_windows;HDC m_displayContext = nullptr;int m_defaultDPI = 96;QWindowsKeyMapper m_keyMapper;QWindowsMouseHandler m_mouseHandler;QWindowsPointerHandler m_pointerHandler;QWindowsMimeConverter m_mimeConverter;QWindowsScreenManager m_screenManager;QSharedPointer<QWindowCreationContext> m_creationContext;
#if QT_CONFIG(tabletevent)QScopedPointer<QWindowsTabletSupport> m_tabletSupport;
#endifconst HRESULT m_oleInitializeResult;QWindow *m_lastActiveWindow = nullptr;bool m_asyncExpose = false;HPOWERNOTIFY m_powerNotification = nullptr;HWND m_powerDummyWindow = nullptr;
};

m_mouseHandler:将windows事件转换为Qt的鼠标事件

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

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

相关文章

1.【Labview白话系列】Labview数组精讲

题主经过写文章一段时间的发现&#xff0c;许多同学对该软件的理解和编程能力是不太一样的&#xff0c;有些知识相对一些同学较为简单&#xff0c;但是有些同学提问就比较困难。那么针对这个问题&#xff0c;题主打算出一期说白话系列的专栏&#xff0c;在该栏目中用最通俗的大…

pycharm手动安装常用插件

下载插件 &#xff08;1&#xff09;下载地址&#xff1a;JetBrains Marketplace 这里以语言包为例子 2、中文语言包 进入pycharm中的设置&#xff0c;点击plugins,选从磁盘中安装插件

算法刷题day24:归并排序

目录 引言概念一、火柴排队二、归并排序三、逆序对的数量四、小朋友排队五、超级快速排序 引言 关于这个归并排序&#xff0c;考察的还是挺多的&#xff0c;在笔试面试中会问你&#xff0c;或者直接让你写一个归并排序&#xff0c;还有竞赛中有时也会考察&#xff0c;不过一般…

PG的JDBC对SQL中绑定变量个数的限制

瀚高数据库 目录 环境 症状 问题原因 解决方案 环境 系统平台&#xff1a;N/A 版本&#xff1a;N/A 症状 问题 有开发人员使用一条Insert values 语句&#xff0c;插入多行数据。例如&#xff1a;表A有88个字段&#xff0c;一条INSERT values …中包含500条数据。 报错…

六、矩阵问题

73、矩阵置零&#xff08;中等&#xff09; 题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a…

应用案例 | Softing echocollect e网关助力汽车零部件制造商构建企业数据库,提升生产效率和质量

为了提高生产质量和效率&#xff0c;某知名汽车零部件制造商采用了Softing echocollect e多协议数据采集网关——从机器和设备中获取相关数据&#xff0c;并直接将数据存储在中央SQL数据库系统中用于分析处理&#xff0c;从而实现了持续监控和生产过程的改进。 一 背景 该企业…

【国家机关办公建筑 大型公共建筑的能耗监测、集中统一管理】安科瑞能耗监测系统整体解决方案

背景 为全面推进大型公建节能管理工作&#xff0c;需建立大型公建节能监管体系&#xff0c;逐步建立起全国联网的大型公建能耗监测平台&#xff0c;在大型公建安装分项计量装置&#xff0c;通过远程传输等手段及时采集分析能耗数据&#xff0c;实现对大型公建的实时动态监测、汇…

Qt应用软件【文件篇】Linux平台QFileSystemWatcher与QFile操作GPIO

文章目录 GPIO权限问题使用Root权限运行应用程序更改GPIO文件的权限使用udev规则自动设置权限监视GPIO与读写GPIO注意事项GPIO权限问题 在Linux系统中,通过sysfs接口操作GPIO时,经常会遇到权限问题,因为默认情况下,访问/sys/class/gpio目录及其文件需要root权限。这可能会…

Docker数据卷的挂载

目录 1 概念 2 常用命令 3 操作步骤(主要讲在创建容器时的挂载) 3.1 挂载在默认目录 3.2 挂载在自定义目录 4 附加内容(查看容器的挂载情况) 1 概念 数据卷&#xff08;volume&#xff09;是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。这样容器内…

go语言基础 -- json的序列化

json序列化 package main import("fmt""encoding/json" )type Monster struct{Name stringAge intSkill string }// 结构体序列化 func serialize_struct() {monster : Monster{Name : "niumo",Age : 500,Skill : "bajiaoshan",}// 这…

微服务day05-Gateway网关

Gateway网关 为了防止微服务能被任何身份的人访问&#xff0c;需要对访问微服务的人做身份认证和权限校验。网关的功能就是对访问用户进行身份认证和权限校验。网关具有3种功能&#xff1a; 身份验证和权限校验&#xff1a;网关作为微服务入口&#xff0c;需要校验用户是是否…

git 如何将多个提交点合并为一个提交点 commit

文章目录 核心命令详细使用模式总结示例 核心命令 git merge branch2 是将分支branch2的提交点合并到本地当前分支。 而在执行这条命令的时候&#xff0c;加一个选项--squash就表示在合并的时候将多个提交点合并为一个提交点。 git merge --squash branch2 先看squash单词的意…

[网络安全提高篇] 一二五.恶意软件分析之PE文件解析和利用Python获取样本时间戳及溯源

2024新的战场,继续奋斗。 “网络安全提高班”新的100篇文章即将开启,包括Web渗透、内网渗透、靶场搭建、CVE复现、攻击溯源、实战及CTF总结,它将更加聚焦,更加深入,也是作者的慢慢成长史。换专业确实挺难的,Web渗透也是块硬骨头,但我也试试,看看自己未来四年究竟能将它…

React Hooks 完全指南:无类组件革命

目录 ​编辑 前言 Hooks的前世 函数组件 类组件 状态和生命周期的管理 Hooks用途以及相应代码 状态管理 用于生命周期管理和副作用操作的 Hooks 用于上下文管理的 Hooks 其他用途的 Hooks 前言 React Hooks 是在 React 16.8 版本中引入的一个非常强大的新特性&…

建筑外窗遮阳系数测试的太阳光模拟器

太阳光模拟器是一种用于测试建筑外窗遮阳系数的高科技设备。它能够模拟太阳光照射房屋的情景&#xff0c;帮助建筑师和设计师更好地了解建筑外窗的遮阳性能&#xff0c;从而提高建筑的能源效率和舒适度。 这种模拟器的工作原理非常简单&#xff0c;它通过使用高亮度的光源和精…

scrapy 爬虫:多线程爬取去微博热搜排行榜数据信息,进入详情页面拿取第一条微博信息,保存到本地text文件、保存到excel

如果想要保存到excel中可以看我的这个爬虫 使用Scrapy 框架开启多进程爬取贝壳网数据保存到excel文件中&#xff0c;包括分页数据、详情页数据&#xff0c;新手保护期快来看&#xff01;&#xff01;仅供学习参考&#xff0c;别乱搞_爬取贝壳成交数据c端用户登录-CSDN博客 最终…

Bee Mobile组件库重磅升级

Bee Mobile组件库重磅升级&#xff01; 丰富强大的组件移动预览快速上手create-bee-mobile Bee Mobile组件库重磅升级&#xff01; Bee Mobile组件库最新 v1.0.0 版本&#xff0c;支持最新的 React v18。 主页&#xff1a;Bee Mobile 丰富强大的组件 一共拥有50多个组件&…

Linux 常用命令汇总(一):查询帮助 文件压缩及解压缩 搜索文件

一、线上查询及帮助命令 1.1 man 1.1.1 介绍 man 命令用于显示命令手册页面&#xff08;manual pages&#xff09;&#xff0c;提供了关于命令、函数、系统调用等的详细文档和使用说明 1.1.2 使用方法 man [选项] [命令或函数或系统调用]1.1.3 参数详解 -f&#xff1a;显…

Java面向对象总结 ( 知识点 | 代码详解 )

类和对象 什么是类&#xff1f; ● 概念&#xff1a;具有相同特征&#xff08;同一类&#xff09;事物的抽象描述&#xff0c;如人类&#xff0c;车类&#xff0c;学生类等。 类的结构&#xff1a; ● 变量: 事物属性的描述(名词) ● 方法: 事物的行为&#xff08;可以做…

基于Flask的宠物领养系统的设计与实现

基于Flask的宠物领养系统的设计与实现 涉及技术&#xff1a;python3.10flaskmysql8.0 系统分为普通用户和管理员两种角色&#xff0c;普通用户可以浏览搜索宠物&#xff0c;申请领养宠物&#xff1b;管理员可以分布宠物信息&#xff0c;管理系统等。 采用ORM模型创建数据&am…