Qt 之 消息机制深入分析

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实现。

猜你喜欢

转载自blog.csdn.net/QIJINGBO123/article/details/88391592
今日推荐