Qt 之 消息机制深入分析

本文深入探讨了Qt的消息机制,对比Windows消息处理流程,详细介绍了Qt如何注册窗口类、执行窗口函数、安装钩子函数及事件循环处理。同时,阐述了事件的产生类型、接收与处理方式、事件过滤器的创建及元对象系统的实现原理。
摘要由CSDN通过智能技术生成

Qt 消息机制深入分析

谈到Qt的消息机制,首先来了解下windows的消息机制

1、windows消息机制
  • 注册窗口类,指定窗口函数(可注册多个窗口);
  • 进入消息循环体;
  • 获取消息PeekMessage();
  • 从应用程序序列中转换消息(TanslateMessage())并派发消息(DisatchMessage());
  • 最后窗口函数负责处理相应的消息。
2、Qt消息机制
  • 注册窗口类,并创建一个隐藏窗口;
  • 执行窗口函数qt_internal_proc();
  • 安装WH_GETMESSAGE类型的钩子函数qt_GetMessageHook();
  • 循环过滤消息并进行消息转化和派发

Qt 事件机制和事件循环处理方式

<1> 什么是事件?

事件:由窗口系统或Qt本身产生的,用于响应所发生的的各类事件。
事件产生类型:
1)键盘或鼠标事件。
用户按下或者松开鼠标上的按键时,就会产生一个鼠标或键盘事件;
2)绘图事件。
某个窗口第一次显示的时候,就会产生窗口重绘事件,从而使得窗口可见;
3)Qt事件。
Qt自身也会产生相应的事件,例如QObject::startTimer()会触发QTimerEvent事件。

<2> 谁来产生事件?

1)输入设备,例如鼠标、键盘;
2)Qt自身事件;
3)用户自定义事件。

<3> 谁来接收和处理事件?

1)QObject;
2)任何一个想接受或处理的对象均需要继承QObject类,可以重写QObject::event()来处理事件,也可以由父类进行处理;
3)Qt的三大机制(内存管理、内省及事件机制)

<4> 谁来负责分发事件?

1)对于NO-GUI需要由QCoreApplication来负责;
2)对于GUI则需要由QApplication负责。

Qt 事件过滤器

<1> 如何创建一个事件过滤器?
  • 通过目标对象调用installEventFilter()来注册监视对象;
  • 在监视对象的eventFilter函数中处理目标对象的事件。
<2> Qt提供5种事件处理和事件过滤的方法
  • 重新实现特殊的事件处理器;
  • 重新实现QObject::event();
  • 在QObject中安装事件过滤器;
  • 在Application对象中安装事件过滤器;
  • 子类化Application并重新实现motify();

Qt 元对象的理解

<1> 元对象

元对象是用来描述另一个对象结构的对象。其中,QMetaObject是元对象模式的一个Qt实现,它提供了一个QObject对象所拥有的属性和方法的信息。元对象有时也被称为反射模式

<2> 元对象系统

提供了两种技术:信号槽和反射机制(内省),除此之外还提供其它的一些特性.
例如提供国际化、翻译字符串,创建新实例等。

<3> 元对象实现原理

标准C++没有对Qt的元对象系统所需要的动态元信息提供支持。Qt通过提供一个独立的MOC工具解决了这个问题。MOC通过解析Q_OBJECT声明的类的定义并通过C++函数来提供可供使用的信息。由于MOC是通过纯C++来实现的,所以QT的元对象系统可以在任意C++编译器上工作。

元对象系统是基于QObject类、Q_OBJECT宏、元对象编译器MOC实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kevin_org

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值