事件机制,事件过滤器,观察者模式

       Qt的信号与槽机制使用了观察者模式。发出信号的对象就是该模式中的主对象,而提供槽函数的对象就是该模式中的观察者。connect函数连接一个信号与一个槽,实际上添加了一个新观察者。而disconnect函数实际上删除一个观察者。当信号产生时,所有观察者的槽函数会被调用,观察者可以更新自己的状态。

       多数情况下,在需要使用观察者模式时,我们简单地使用信号与槽的机制即可。然而,在Qt的事件处理机制中,需要我们显式地使用该模式。

       Qt使用QEvent来描述事件。该类具有多个子类,每个子类描述某种类型的事件。比如,类QMouseEvent表示与鼠标相关的事件。每个子类所管理的事件又被细分为更小的类型,每个小类型具有一个事件名称,每个名称被定义为QEvent中的一个枚举常量。比如类QMouseEvent管理的鼠标事件被定义为QEvent中的MouseButtonDblClick、MouseButton Release及MouseMove等枚举常量。

       大多数情况下,程序员并不需要直接处理这些底层事件。Qt会将它们转化为程序员更感兴趣的信号。然而,当我们希望一个控件对象以不同于Qt默认的方式处理事件时,就需要编写代码直接处理这些底层事件。

       有两种方式允许一个控件类直接处理事件:
1、QWidget从其父类QObject继承了一个虚函数event(),用来处理传递过来的所有事件。令该控件类重载event函数,即可直接处理底层事件。
2、为了方便编程,QWidget在函数event()中将一些常见的事件分发给一些成员函数来处理。比如,函数mouseDoubleClickEvent(),moveEvent()分别处理鼠标双击事件,鼠标移动事件,函数resizeEvent()处理应用程序窗口尺寸更改事件。这些函数都是虚函数,控件类可以重载这些虚函数,以直接处理对应的事件。

       事件并不会被群发给所有的控件。当一个事件发生时,Qt会将该事件首先发送给当前获取聚焦的控件。如果控件忽略该事件,其event函数返回false,Qt会将该事件传递给该控件的父控件。

       使用Qt的事件滤波器(Event Filter)可以改变事件的传递路径。
1、调用installEventFilter函数,将观察控件设置为目标控件的观察者。这样,本应发送给目标控件的所有事件首先被发送给观察控件。
2、观察控件用成员函数eventFilter()处理这些事件,函数的第一个参数表示目标控件,第二个参数表示本应发送给目标控件的事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值