9.1事件机制与原理分析
好文章,来自【福优学苑@音视频+流媒体】
9.1事件机制与原理分析
9.1.1 什么是Qt事件驱动?
我们在写Qt工程类项目的时候都会发现,主程序里面都有这么一段代码:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
实际上a.exec()便是Qt程序进入事件消息循环,
9.1.2 图形界面应用程序的消息处理模型
特点:
基于操作系统才能运行
GUI应用程序提供的功能必须由用户触发
用户操作界面时操作系统是第一个感知的
系统内核的消息通过事件处理转变成QT的信号
9.1.3 Qt中的事件处理
(1)在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent.
事件处理的核心包括事件①产生、②分发、③接受和处理
①事件的产生
谁来产生事件?
最容易想到的是我们的输入设备,比如键盘、鼠标产生的
keyPressEvent,keyReleaseEvent,
mousePressEvent,mouseReleaseEvent事件
(被封装成QMouseEvent和QKeyEvent)。
②Qt中事件的分发
谁来负责分发事件?
对于non-GUI的Qt程序,是由QCoreApplication负责将QEvent分发给QObject的子类-Receiver.
对于Qt GUI程序,由QApplication来负责
③事件的接受和处理
谁来接受和处理事件?
答案是QObject。
类是整个Qt对象模型的心脏,事件处理机制是
(
内存管理、
内省intropection、
事件处理制
)之一。
任何一个想要接受并处理事件的对象均须继承自QObject,可以选择重载QObject::event()函数或事件的处理权转给父类。
9.1.4 QObject的内省机制
所谓内省是指面向对象语言的一种在运行期间查询对象信息的能力, 比如如果该语具有运行期间检查对象型别的能力,那么我们称它是型别内省(type intropection)的,型别内省可以用来实施多态。
c++的内省比较有限,它仅支持上面所说的型别内省, C++的型别内省是通过运行时类型识别(RTTI)。Qt拓展了C++的内省机制,(实际上,它并没有采用c++的RTTI),而是提供了更为强大的元对象(meta object)机制,来实现内省。接下来,就让我们看看,Qt是如何扩展c++内省机制的。
要深刻理解Qt的内省机制,首先理解QObject,QObject类是整个Qt对象模型的心脏,Qt对象模型最为核心的功能是提供一种无缝的对象通讯机制,即就是我们所熟知的信号和槽。好文章,来自【福优学苑@音视频+流媒体】
9.1.5 Qt平台将系统产生的消息转变成Qt事件
Qt事件是一个QEvent(或子类)的对象
有时一个事件包含多个事件类型,比如鼠标事件又可以分为鼠标按下、双击、和移动多种操作
事件类型由QEvent类的枚举型QEvent::Type来表示,可由帮助文档进行查询
Qt事件用于描述程序内部或外部发生的对应动作(描述的是操作系统发生来的消息,一个系统消息对应着一个消息事件)
任意QObject对象都具备时间处理的能力
QEvent及其子类对象
note:QEvent子类可以表示一个事件,但并不能处理这个事件
Qt 程序需要在main()函数创建一个QApplication对象,然后调用它的exec()函数。
这个函数就是开始 Qt 的事件循环。
在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。
当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent。
在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。
event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。
如上所述,event()函数主要用于事件的分发。
9.1.6 GUI应用程序的事件处理方式
Qt事件产生后会立即被分发到QWidget对象(QObject的子类,如按键QPushButton对象等)
QWidget对象其内部会有一个event(QEVent*)函数被调用,进行事件处理
event()根据事件类型调用不同的事件处理函数(默认的子函数)
在事件处理函数中发送Qt中预定义的信号
调用信号关联的槽函数
好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***