安装事件过滤器(Installing Event Filters)

转载 2012年03月28日 13:36:22

转自:http://blog.csdn.net/iamdbl/article/details/1630043


Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理。

假设我们有一个CustomerInfoDialog控件,由一些QLineEdit控件组成。我们希望使用Space键得到下一个QLineEdit的输入焦点。一个最直接的方法是继承QLineEdit重写keyPressEvent()函数,当点击了Space键时,调用focusNextChild():
void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_Space) {
        focusNextChild();
    } else {
        QLineEdit::keyPressEvent(event);
    }
}
这个方法有一个最大的缺点:如果我们在窗体中使用了很多不同类型的控件(QComboBox,QSpinBox等等),我们也要继承这些控件,重写它们的keyPressEvent()。一个更好的解决方法是让CustomerInfoDialog监视其子控件的键盘事件,在监视代码处实现以上功能。这就是事件过滤的方法。实现一个事件过滤包括两个步骤:
1.      在目标对象上调用installEventFilter(),注册监视对象。
2.      在监视对象的eventFilter()函数中处理目标对象的事件。
注册监视对象的位置是在CustomerInfoDialog的构造函数中:
CustomerInfoDialog::CustomerInfoDialog(QWidget *parent)
    : QDialog(parent)
{
    ...
    firstNameEdit->installEventFilter(this);
    lastNameEdit->installEventFilter(this);
    cityEdit->installEventFilter(this);
    phoneNumberEdit->installEventFilter(this);
}
事件过滤器注册后,发送到firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit控件的事件首先到达CustomerInfoDialog::eventFilter()函数,然后在到达最终的目的地。
下面是eventFilter()函数的代码:
bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)
{
    if (target == firstNameEdit || target == lastNameEdit
            || target == cityEdit || target == phoneNumberEdit) {
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if (keyEvent->key() == Qt::Key_Space) {
                focusNextChild();
                return true;
            }
        }
    }
    return QDialog::eventFilter(target, event);
}
首先,我们看是目标控件是否为QLineEdit,如果事件为键盘事件,把QEvent转换为QKeyEvent,确定被敲击的键。如果为Space键,调用focusNextChild(),把焦点交给下一个控件,返回true通知Qt已经处理了这个事件,如果返回false,Qt将会把事件传递给目标控件,把一个空格字符插入到QLineEdit中。
如果目标控件不是QLineEdit,或者事件不是Space敲击事件,把控制权交给基类QDialog的eventFilter()。目标控件也可以是基类QDialog正在监视的控件。(在Qt4.1中,QDialog没有监视的控件,但是Qt的其他控件类,如QScrollArea,监视一些它们的子控件)
Qt的事件处理有5中级别:
1.      重写控件的事件处理函数:如重写keyPressEvent(),mousePressEvent()和paintEvent(),这是最常用的事件处理方法,我们已经看到过很多这样的例子了。
2.      重写QObject::event(),在事件到达事件处理函数时处理它。在需要改变Tab键的惯用法时这样做。也可以处理那些没有特定事件处理函数的比较少见的事件类型(例如,QEvent::HoverEnter)。我们重写event()时,必须要调用基类的event(),由基类处理我们不需要处理的那些情况。
3.      给QObject对象安装事件过滤器:对象用installEventFilter()后,所有达到目标控件的事件都首先到达监视对象的eventFilter()函数。如果一个对象有多个事件过滤器,过滤器按顺序激活,先到达最近安装的监视对象,最后到达最先安装的监视对象。
4.      给QApplication安装事件过滤器,如果qApp(唯一的QApplication对象)安装了事件过滤器,程序中所有对象的事件都要送到eventFilter()函数中。这个方法在调试的时候非常有用,在处理非活动状态控件的鼠标事件时这个方法也很常用。
5.      继承QApplication,重写notify()。Qt调用QApplication::nofity()来发送事件。重写这个函数是在其他事件过滤器处理事件前得到所有事件的唯一方法。通常事件过滤器是最有用的,因为在同一时间,可以有任意数量的事件过滤器,但是notify()函数只有一个。
许多事件类型,包括鼠标,键盘事件,是能够传播的。如果事件在到达目标对象的途中或者由目标对象处理掉,事件处理的过程会重新开始,不同的是这时的目标对象是原目标对象的父控件。这样从父控件再到父控件,知道有控件处理这个事件或者到达了最顶级的那个控件。
图7.2显示了一个键盘事件在一个对话框中从子控件到父控件的传播过程。当用户敲击一个键盘,时间首先发送到有焦点的控件上(这个例子中是QCheckBox)。如果QCheckBox没有处理这个事件,Qt把事件发送到QGroupBox中,如果仍然没有处理,则最后发送到QDialog中。
Figure 7.2. Event propagation in a dialog

相关文章推荐

QT event事件过滤器

QT event事件过滤器 今天因为想设计一个功能:通过键盘输入up和down键,移动QPlainTextEdit控件的光标,但是发现并不好实现。想起了《Qt学习之路》提中的事件过滤器,正好能用上。 ...
  • CSLQM
  • CSLQM
  • 2016-12-15 20:22
  • 142

Qt 安装事件过滤器installEventFilter

Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理。 假设我们有一个CustomerInfoDialog控件,由一些QLin...

QT事件过滤器

安装事件过滤器(installEventFilter) ,过滤子控件事件,截获控件按键、鼠标事件

文章来自:http://blog.csdn.net/iamdbl/article/details/1630043# 【最近又搞回QT,嵌入式中经常会用到自定义键盘,要在程序里判断事件,这篇文章很...

安装事件过滤器(installEventFilter) ,过滤子控件事件,截获控件按键、鼠标事件

文章来自:http://blog.csdn.NET/iamdbl/article/details/1630043#【最近又搞回QT,嵌入式中经常会用到自定义键盘,要在程序里判断事件,这篇文章很好的诠释...

Qt 事件过滤器

Qt 事件过滤器是本文要介绍的内容,Qt 事件模型一个真正强大的特色是一个QObject的实例能够管理另一个QObject 实例的事件。 让我们试着设想已经有了一个CustomerInfoDialog...

Qt的事件过滤器

http://hi.baidu.com/wangping84/item/d2099d0d200e0f68d55a11fc Qt事件模型一个真正强大的特色是一个QObject的实例能够管理另一个QOb...

Qt学习笔记(1)---QT5利用事件过滤器实现在控件上绘图

Qt中要在控件中绘制图像,需要重写paintevent函数,本文通过EventFilter(事件过滤器)来实现在控件上的图形绘制。 .h文件 #ifndef WIDGET_H #define WIDG...

Qt学习之路(22): 事件过滤器

本文出自 “豆子空间” 博客,原文出处http://devbean.blog.51cto.com/448512/231861 Qt创建了QEvent事件对象之后,会调用QObject的event...

Qt 事件过滤器

从QObject继承的函数可以调用installEventFilter函数来安装一个过滤器。      所谓安装一个过滤器就是指:调用installEventFilter的对象安装一个过滤器,所有到达...
  • fly542
  • fly542
  • 2011-05-28 12:18
  • 1307
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)