通过鼠标事件来看QT/Embedded 窗体事件是如何派发的

将ue4程序嵌入qt界面显示 需求:将ue4程序嵌入qt界面显示 思路:通过使用 windowsAPI 对ue4窗口进行设置跟随qt界面以及活动窗口时的位置层序设置 阅读详情

QT的窗体系统可以包含多个进程,对于Linux上的应用,一个进程可以对应一个应用程序,每个应用程序都有自己的MainWindow,也可以有自己的Widget stack.。假设一种情况:同时打开多个应用,并且各个应用之间的Windows不存在完全覆盖,当我们用鼠标点击某个应用的窗体,这个应用的窗体便会出现在屏幕的最上层。对于了解windows窗体服务器的同行来说,理解这个并不难,可能有一个类似于Windows XP X-Windows Sever的进程负责管理鼠标、键盘、与LCD显示的操作。对于智能手机的GUI我是第一次接触,非智能手机的窗体管理是比较简单的,以我以前从事的一个手机平台为例,手机只存在一个dialog Stack, 把这个stack 看成一个Z坐标,栈底位于坐标原点,显示一整屏幕完整的画面就是从栈顶沿Z坐标向下找到没有被完全覆盖的windows直到整个屏幕数据被完全填充,按键事件传入到ui_task(ui_task 负责初始化其他应用,所有windows event都由dialogstack 应用负责分发)。回归正卷,QT是如何管理窗体的呢?下面详述。

 

QApplication如何取得Mouse Event?

查看QApplication的代码,存在一个GuiSever类型的应用,GuiServer类型的应用与其他类型的应用有什么区别的呢?最大的区别就在于通过qt_init初始化函数调用QWSServer::startup这个应用建立了一个窗体服务器。在QWSServer的构造函数中:

  openDisplay();     //初始化显示、屏幕参数,打开LCD。

      openMouse();      //打开鼠标设备

  openKeyboard();    //打开键盘设备

openMouse() :QWSMouseHandler* h = newMouseHandler(ms)打开鼠标设备,打开鼠标设备后,通过QSocketNotifier接口监听打开的鼠标设备文件描述符,在QWSMouseHandler构造函数中通过调用setMouseHandler 建立了window Server与鼠标设备之间的通信即:在QWSServer中 connected SIGNAL(mouseChanged)与SLOT(setMouse)(目前这个平台与新的QT开发包有出入,在qt-embedded-free-3.3.6中 鼠标与windows Server之间通讯是通过在qmouse_ws.cpp中直接调用QWSServer::sendMouseEvent 来实现的)。走到这,我们已经能够获取鼠标数据了。这些数据最终会传递到哪个窗体,在sendMouseEvent中通过调用window.At(pos)查找windows List所有应用的TOP-LEVEL windows保存在此链表中,(TOP-LEVEL窗体是指无parent或者style为:WType_TopLevel的窗体)中请求响应区域包含鼠标坐标的窗体(requested-region: 窗体显示的区域),一旦找到数据便会传递到此窗体(消息放入到QApplication的incoming消息队列中,由QApplication负责派发)然后通过Client Socket将此消息传递到相应的application的消息队列里。

 Windows List是如何建立的?
我们在创建每一个QWidget对象时,系统会调用QWidget::create函数,如果我们创建的这个QWidget为TOP-LEVEL则将发送消息到QWSSever在这里创建一个GlobalWinowsID(参看QWSServer中get_object_id()调用),如果QWidget为Child widget则在这个应用中创建了一个LocaWindowslId,(参看takeLocalId())不管得到的winodwsId在哪儿被创建,在每个独立的Application中都会通过QWidget::setWinId保存。GlobalWindows与LocalWindows的区别是:在QWSServer中创建的GlobalwindowsID用于全局QApp即:按键,鼠标等事件通过QWSSever传递至相应的应用。按键,鼠标事件则在获得这些事件的QApp的Focus Widget中处理,这些Focus Widget可以是GlobalWindows 也可以是LocalWindows。在这个窗口没有show之前,我们还只是得到了WindowsId,当窗口被显示时,在QWSServer中将创建一个基于GlobalWindowsID的QWSWindow对象并将此对象保存在QWSServer的windows List中。
 
QApplication中Mouse Event的传递与处理
当application的消息队列不空时调用processEvents来处理消息队列。如果应用没有模式对话框,并且没有绑定Mouse Event的widget,则在Application中遍历GlobalWindow(对用户而言是可以鼠标所在的那个窗体)所对应的Widget所有子QWidget对象,也就是说首先从他的child widget开始查找响应Mouse Event的Widget,如果这个窗口没有被优先级更高的窗口被遮盖,便会调用raise函数,将窗体调整到windows list的最上层。

QWSSever与Application之间通信管道的建立

QT支持多进程,对一个嵌入式设备而言,存在一个独立的GuiServer类型的应用,这个应用作为服务器,其他的应用作为客户端。服务器与客户端的连接在应用初始化的时候完成。

服务器:

Server Application进程通过调用QWSServer::startup完成Server的建立。

 客户端:

         Application 调用QWSDisplayData::init创建QWSSocket对象并通过connectToLocalFile建立与服务器的连接。

QT 嵌入exe应用程序 并获取鼠标事件 mouse keyboard event QT 嵌入第三方程序方法: QProcess *Process = new QProcess(this); //Process必须为指针,不然对象销毁时第三方exe会被关闭     Process->start(“Everything\\Everything.exe"); //启动exe     if (Process->waitForStarted())     {         S 阅读详情

相关推荐

QT鼠标事件总结(全)

QT鼠标事件总结(全) 鼠标移动事件 鼠标按键事件

QT/Embedded窗体事件派发机制

QT的窗体系统可以包含多个进程,对于Linux上的应用,一个进程可以对应一个应用程序,每个应用程序都有自己的MainWindow,也可以有自己的Widget stack.。假设一种情况:同时打开多个应用,并且各个应用之间的Windows不存在完全覆盖,当我们用鼠标点击某个应用的窗体,这个应用的窗体便会出现在屏幕的最上层。对于了解windows窗体服务器的同行来说,理解这个并不难,可能有一个类似于W

wwhotcorpse的专栏 457

Qt实现全局钩子拦截鼠标键盘消息修改消息

Qt实现全局钩子,拦截鼠标键盘消息,修改消息,在Qt 4.86上编译通过,适合学习,分享快乐,谢谢。

Qt 鼠标事件触发到转发到传到接收对象全过程剖析

总结的说,Qt的事件和Qt中的signal不一样。如果我们使用系统预定义的控件,那我们关心的是信号,如果自定义控件我们关心的是事件。假如你在一个widget上连续地调用update() 十次,因update()而产生的这十个事件,将会自动地被合并为一个单独的事件,但是QPaintEvents事件附带的区域信息也合并了。但有时,你可能需要在调用event()函数之前做一些自己的操作,比如,对话框上某些组件可能并不需要响应回车键按下的事件,此时,你就需要重新定义组件的event()函数。

临渊羡鱼,不如退而结网 1949

实战Nocobase插件开发:如何用yarn pm命令快速创建和测试API接口插件

本文详细介绍了如何使用Nocobase插件开发工具快速创建和测试API接口插件,涵盖从环境配置、插件骨架生成到数据模型定义和接口实现的完整流程。通过yarn pm命令简化开发步骤,帮助开发者高效构建支持CRUD的API插件,适用于低代码平台开发场景。

weixin_29313239的博客 456

开关电源的纹波和噪声电压-抑制方法

开关电源(包括AC/DC转换器、DC/DC转换器、AC/DC模块和DC/DC模块)与线性电源相比较,最突出的优点是转换效率高,一般可达80%~85%,高的可达90%~97%;其次,开关电源采用高频变压器替代了笨重的工频变压器,不仅重量减轻,体积也减小了,因此应用范围越来越广。 但开关电源的缺点是由于其开关管工作于高频开关状态,输出的纹波和噪声电压较大,一般为输出电压的1%左右(低的为输出电压的0.5%左右),最好产品的纹波和噪声电压也有几十mV;而线性电源的调整管工作于线性状态,无纹波电压,输出的噪声电压也

ltqdxl的博客 1万+

触摸屏中鼠标事件的捕获和传递及触摸屏的移植

<br />触摸屏中鼠标事件的捕获和传递及触摸屏的移植<br />在Linux系统中,如果硬件设备的驱动程序被正确安装,那么在/dev路径下会有相应的设备文件,它们是对应硬件设备的驱动程序接口,应用程序可以打开这些设备文件,从中读取的数据就对应着硬件设备传回的信息。当鼠标被点击时,会产生中断并进入中断处理程序,在中断处理程序中,鼠标的动作会被翻译成相应的数据存在一个数据缓冲区中。用户打开设备文件后,就是从这个这个缓冲区读取数据的。注意,这时的数据是最原始的数据。<br />当Qt应用程序作为GuiServe

yihui8的专栏 3009

拯救者R9000P-2021-AMD5800H黑苹果EFI配置与优化指南

本文详细介绍了在联想拯救者R9000P 2021款(搭载AMD锐龙7 5800H处理器)上安装和优化黑苹果系统的完整指南。内容涵盖EFI配置、OpenCore引导设置、关键驱动(如NootedRed核显驱动)的调整,以及安装后的性能调优与常见问题解决,旨在帮助开发者和极客用户在这款游戏本上搭建稳定可用的macOS开发环境。

weixin_29291069的博客 281

Qt-事件处理

一、QWidget的事件分发 首先QWidget产生的事件会发送给event(),然后event()根据事件的类型不同来进行分发,常见的事件类型Qt已经定义了对应的事件处理函数,如鼠标事件、键盘事件等为最常用的。其中event()事件的返回值为bool类型,如果它对接受的事件进行了处理,不需要再继续往下传了,就返回true,否则就返回到对应的父控件中继续进行处理。注意,必须要将未处理的事件返回给父控件进行处理。 1、常用的鼠标事件 enterEvent(QEvent *event) leaveEvent

Jeffxu_lib的博客 922

告别蓝牙音质妥协:用ESP32和PCM5102搭建WiFi无损音频播放器(附完整代码)

本文详细介绍了如何利用ESP32微控制器和PCM5102 DAC芯片构建一套完整的WiFi无损音频流媒体系统,彻底摆脱蓝牙协议的音质束缚。从硬件原理到软件实现,包括核心器件选型、电路设计、I2S音频驱动实现以及系统优化方案,帮助音频发烧友实现高保真无线音频传输。

weixin_30733003的博客 541

云漾AI创作平台实战:如何用GPT4.0+Midjourney快速生成商业级插画(附Prompt模板)

本文详细介绍了如何利用云漾AI创作平台结合GPT4.0和Midjourney快速生成商业级插画。通过智能文案生成与视觉化工作流,大幅提升创作效率,适用于电商、社交媒体等多种场景。文章包含实用Prompt模板和参数调整技巧,帮助设计师和内容创作者高效产出专业插画。

weixin_29251567的博客 216

命令行实现FFMpeg拉流推流方法思路

ffmpeg -f GDIgrab [-offset_x 10 -offset_y 20 -video_size 640x480] -i title="摄像头窗口标题" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv "视频推流服务器地址"指定摄像头窗口推流(只能采集主窗口,子窗口无法采集,可设置采集主窗口指定区域图像)非原始数据,通过二次采集,依附窗口且该窗口不能被关闭。显示摄像头至窗口,推流指定窗口图像至服务器。

cipher1985的博客 1145

浅谈专项测试之弱网络测试

浅谈专项测试之弱网络测试 一.弱网络测试背景 移动端产品的使用并非完全都是在流畅的wifi环境,大部分用户主要使用4G,3G,2G等网络,另外因为移动端产品使用的场景多变,如进公交,上地铁,坐电梯,使得弱网测试显得尤为重要。考虑到各种场景的客户端展示及容错,提升产品的印象和用户体验,提高产品的健壮性,弱网测试必不可少。 二.弱网络测试建议 网下需要进行功能点测试,无网络测试,网络切换测试等,测试过程除了关注功能点的实现,还应关注用户体验等各个方面 三.弱网络测试通用功能点总结 四.弱网络测试用例实例

ITstudy001的博客 1010

qt linux鼠标事件穿透,qt 窗口鼠标穿透

qt实现鼠标穿透,如果要被穿透窗口只有一层,也即没有嵌套窗口,直接只用对子窗口使用setAttribute(Qt::WA_TransparentForMouseEvents,true);就ok,意味着鼠标事件让父窗口响应。如果要穿透的窗口含有嵌套窗口,那么接着往下看快速使用///////////////////////////////////////////////////////////////...

weixin_30324103的博客 801

Yocto系列讲解[入门篇]36 - 编译arm虚拟机qemuarm

玩一下qemuarm,因为之前用的x86架构

fulinux的博客 2566

web逆向伪瑞数案例:宝武资源有限公司(面向对象补环境)

声明:该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关前言:之所以称伪瑞数案例,是因为该网站,无论是补环境的方法、还是环境都和瑞数差不多,因为第一次遇到这种网站,不确定是不是瑞数的一种,所以这里称伪瑞数,有知道的道友,可以评论区评论下,共同进步。,这里就不做多介绍了1.瑞数中的是t​s,而该网站是_ss。2.外链js代码不能格式化,否则补环境时会遇到一个超过数组长度的报错。3.call执行后的虚拟文件中有超多的debugger。

老衲爱洗头的博客 2534

Qt 事件机制

【1】事件 事件是可以被控件识别的操作。如按下确定按钮、选择某个单选按钮或复选框。 每种控件有自己可识别的事件,如窗体的加载、单击、双击等事件,编辑框(文本框)的文本改变事件等等。 事件就是用户对窗口上各种组件的操作。 【2】Qt事件 由窗口系统或Qt自身产生的,用以响应所发生各类事情的操作。具体点,Qt事件是一个QEvent对象,用于描述程序内部或外部发生的动作。 【3】Qt事件产生...

weixin_30387423的博客 609

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

QT打开外部程序并嵌入Qt子窗口的缺点

总之,这样做,是不好用的,所以要么就是以分离软件的形式启动,让它独立运行,或者直接嵌入源码一起编译了(在两个软件都是自己开发的情况了,因为需要源码)。

biao2488890051的博客 3419

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

QML鼠标事件传递(鼠标穿透)

有时候,我们的MouseArea区域重叠了,这时候默认是最上层的MouseArea接收鼠标事件,而我们可能需要底层也能接收这个事件。虽然可以关联两个MouseArea的信号,但是这种操作局限性比较大,耦合性太强,某个MouseArea并不能被外部所见等等。在Qt Widgets中可以通过setAttribute(Qt::WA_TransparentForMouseEvents,true...

龚建波 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【Qt】QWidget类详解(函数篇)_qt qwidget 常用函数

QWidget类是所有用户界面对象的基类。

2401_85014148的博客 1317

Qt事件处理机制整个流程--以鼠标在一个窗口中点击为例

转载自:http://mobile.51cto.com/symbian-272812.htm,在此谢谢原作者的分享! ------------------------第一部分---------------------- 本篇来介绍Qt 事件处理机制 。深入了解事件处理系统对于每个学习Qt人来说非常重要,可以说,Qt是以事件驱动的UI工具集。 大家熟知Signals/Slots在多线

zgrjkflmkyc的专栏 1万+

QT中鼠标响应函数setMouseCallback类型不匹配问题解决

1.想要一个静态函数,你给它一个非静态 可能是最好的办法是有一个静态的回调函数,即重定向到您的 void mouseWrapper( int event, int x, int y, int flags, void* param ); // forward decl needed here struct MainWindow { void onMouse( int event, int x

m0_37906001的博客 2854

【touch screen】Qt触摸屏原理及实现

Qt中触摸屏实现鼠标原理: Pointer Handling Layer The mouse driver (represented by an instance of the QWSMouseHandlerclass) is loaded by the server application when it startsrunning(当鼠标驱动需要运行时), using Qt’s plugins...

qq_43248127的博客 5081

在嵌入式平台上QT 在启动后出现一个小绿方框,里面有个鼠标指针去掉的方法

不说废话直接进入正题。 第一步:也是最费时的一步      首先进入要编译的qt源文件,我的路径在work/imx6/qt-everywhere-opensource-src-4.8.5/src下面,让我搜索qwscursor.cpp       void QWSServerPrivate::initializeCursor() { Q_Q(QWSServer); #ifndef...

qq_35570735的博客 1517

详解Qt中的鼠标事件

在Qt中,处理鼠标事件是构建交互式界面的关键。Qt提供了一系列与鼠标相关的事件处理函数,允许开发者捕获鼠标的各种动作,如按下、释放、移动、双击等。以下是鼠标事件的使用方法、技巧以及注意事项,并附带C++代码示例。

简介 2622
上一篇: (收藏)[Unix] vi基本操作方法
下一篇: _IO, _IOR, _IOW, _IOWR 宏的用法与解析
futurepeter
博客等级 码龄19年 8粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值