目录
3. 子类化 QApplication,并重写notify()
事件过滤的方法
1. 在 QObject 中安装事件过滤器
调用 installEventFilter() 注册监视对象后, 目标对象的所有事件会首先发送给这个监视对象的 eventFilter(), 它可以根据需要检查和丢弃事件。 若同一个对象安装了多个事件过滤器,那么就会按照安装顺序逆序激活。可以使用 QObject::removeEventFilter() 函数删除现有的事件过滤器。
2. 在 QApplication 对象中安装事件过滤器
一旦为 qApp 注册了事件过滤器,那么该应用程序的每个对象的每个事件都会在发送到其他事件过滤器之前,首先发送给这个对象的 eventFilter()。
3. 子类化 QApplication,并重写notify()
Qt 调用该函数来发送一个事件,重写该函数是在事件过滤器得到所有事件之前获得它们的唯一方法。
事件过滤的示例
第一种方法最常用,我们使用上一章的例子( MyWidget )来观察在 QObject 中安装事件过滤器后事件的传递。
单个事件过滤器
为 w0 安装事件过滤器 w2,然后重写 eventFilter() 函数,当鼠标按下事件发生时,打印出过滤器及目标对象的索引,代码如下。结合代码,可以先思考下面两个问题:
- 如果在 Widget0 的区域点击,会打印出什么信息?
- 如果在 Widget2 的区域点击,会打印出什么信息?
- 如果 MyWidget::eventFilter() 函数中,鼠标按下事件的 if 语句中返回 false,会打印出什么信息?
MyWidget::MyWidget(int index, QWidget *parent) :
QWidget(parent),
index(index)
{
}
void MyWidget::paintEvent(QPaintEve