`
izuoyan
  • 浏览: 9222751 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多
版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/231861

Qt 创建了QEvent事件对象之后,会调用QObject的event()函数做事件的分发。有时候,你可能需要在调用event()函数之前做一些另外的 操作,比如,对话框上某些组件可能并不需要响应回车按下的事件,此时,你就需要重新定义组件的event()函数。如果组件很多,就需要重写很多次 event()函数,这显然没有效率。为此,你可以使用一个事件过滤器,来判断是否需要调用event()函数。

QOjbect有一个eventFilter()函数,用于建立事件过滤器。这个函数的签名如下:

virtual bool QObject::eventFilter ( QObject * watched, QEvent * event )


如果watched对象安装了事件过滤器,这个函数会被调用并进行事件过滤,然后才轮到组件进行事件处理。在重写这个函数时,如果你需要过滤掉某个事件,例如停止对这个事件的响应,需要返回true。

bool MainWindow::eventFilter(QObject *obj, QEvent *event )
{
if (obj == textEdit) {
if (event ->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event );
qDebug() << "Ate key press" << keyEvent->key();
return true ;
} else {
return false ;
}
} else {
// pass the event on to the parent class
return QMainWindow::eventFilter(obj, event );
}
}


上 面的例子中为MainWindow建立了一个事件过滤器。为了过滤某个组件上的事件,首先需要判断这个对象是哪个组件,然后判断这个事件的类型。例如,我 不想让textEdit组件处理键盘事件,于是就首先找到这个组件,如果这个事件是键盘事件,则直接返回true,也就是过滤掉了这个事件,其他事件还是 要继续处理,所以返回false。对于其他组件,我们并不保证是不是还有过滤器,于是最保险的办法是调用父类的函数。

在创建了过滤器之后,下面要做的是安装这个过滤器。安装过滤器需要调用installEventFilter()函数。这个函数的签名如下:

void QObject::installEventFilter ( QObject * filterObj )


这 个函数是QObject的一个函数,因此可以安装到任何QObject的子类,并不仅仅是UI组件。这个函数接收一个QObject对象,调用了这个函数 安装事件过滤器的组件会调用filterObj定义的eventFilter()函数。例 如,textField.installEventFilter(obj),则如果有事件发送到textField组件是,会先调用 obj->eventFilter()函数,然后才会调用textField.event()。

当然,你也可以把事件过滤器安装到QApplication上面,这样就可以过滤所有的事件,已获得更大的控制权。不过,这样做的后果就是会降低事件分发的效率。

如果一个组件安装了多个过滤器,则最后一个安装的会最先调用,类似于堆栈的行为。

注意,如果你在事件过滤器中delete了某个接收组件,务必将返回值设为true。否则,Qt还是会将事件分发给这个接收组件,从而导致程序崩溃。

事件过滤器和被安装的组件必须在同一线程,否则,过滤器不起作用。另外,如果在install之后,这两个组件到了不同的线程,那么,只有等到二者重新回到同一线程的时候过滤器才会有效。

事 件的调用最终都会调用QCoreApplication的notify()函数,因此,最大的控制权实际上是重写QCoreApplication的 notify()函数。由此可以看出,Qt的事件处理实际上是分层五个层次:重定义事件处理函数,重定义event()函数,为单个组件安装事件过滤器, 为QApplication安装事件过滤器,重定义QCoreApplication的notify()函数。这几个层次的控制权是逐层增大的。

本文出自 “豆子空间 ” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/231861

分享到:
评论

相关推荐

    QT 事件过滤器实例

    通过查看和分析这个示例,你可以学习如何将事件过滤器应用于自己的QT项目中,提升应用程序的交互性和定制化程度。 总之,QT事件过滤器是QT框架中一个强大且灵活的工具,它使得对象间通信和事件处理变得更加便捷。...

    《Qt 学习之路 2》

    《Qt学习之路2》中也会介绍如何通过覆盖event()函数来处理事件,以及如何使用事件过滤器进行事件的过滤和拦截,这些内容对于编写响应式和交互性强的应用程序非常重要。 最后,Qt还提供了文件操作相关的组件和类,如...

    Qt学习之路.pdf

    ### Qt学习之路知识点总结 #### 一、基础知识与入门 - **Hello, World!** - **知识点**:Qt环境搭建、第一个Qt程序编写、基本的窗口显示。 - **重要性**:作为Qt初学者的第一课,通过简单的示例程序帮助理解Qt的...

    QT学习之路

    标题《QT学习之路》指明了文档的主要内容,即向读者介绍如何学习Qt这一跨平台的C++图形用户界面应用程序开发框架。Qt是一个功能强大的工具,能够用来开发具有图形用户界面的应用程序,并且支持多种操作系统平台,如...

    Qt+学习之路+2

    - **背景**: 本文档是基于作者之前的一个系列教程——《Qt学习之路》的更新版本,旨在适应Qt的新版本和发展趋势。 - **目的**: 更新和完善原有教程内容,使其更适合Qt 4.x和即将到来的Qt 5的学习需求。 - **定位**: ...

    QT事件学习

    QT 事件学习 本文档主要探讨 QT 事件处理机制,内容从浅到深,涵盖了 QT 事件的产生、处理和派发机制。...QT 事件处理机制是程序运行的主线,QT 事件的产生、处理和派发机制都是通过事件循环和事件过滤器实现的。

    其实这本PDF就是Qt学习之路第一版

    ### Qt学习之路知识点总结 #### 一、前言:Qt简介与选择 - **Qt**是一种跨平台的应用程序开发框架,广泛应用于桌面、移动设备及嵌入式系统的GUI应用程序开发。 - C++的GUI编程并非C++标准的一部分,因此开发者在...

    QT 文件操作 事件过滤器 鼠标移动事件

    在QT中,文件操作是核心功能之一,而事件过滤器和鼠标移动事件则是实现交互式应用程序的关键技术。 首先,让我们深入理解QT中的文件操作。QT库提供了丰富的类和函数,如`QFile`、`QTextStream`、`QDir`等,用于读取...

    Qt学习之路 绝对经典

    ### Qt学习之路 绝对经典 #### 一、前言:C++ GUI编程的选择与Qt简介 在C++的世界里,GUI(图形用户界面)编程并非语言标准的一部分,这与Java有所不同,在Java中,开发者可以选择AWT/Swing或SWT/JFace等标准库来...

    QT学习之路2 (1~82篇)

    21. 事件过滤器 22. 事件总结 23. 自定义事件 24. Qt 绘制系统简介 25. 画刷和画笔 26. 反走样 27. 渐变 28. 坐标系统 29. 绘制设备 30. Graphics View Framework 31. 贪吃蛇游戏(1) 32. 贪吃蛇游戏(2) 33. ...

    qt学习之路.pdf

    《Qt学习之路》是一份适合初学者的Qt入门教程,内容包括基础知识点到较为深入的GUI开发技术。其内容丰富,讲解细致,旨在帮助开发者从零开始,逐步深入掌握Qt框架,最终能够独立编写跨平台的应用程序。 1. 前言 ...

    QT EventFilter事件过滤器样例(无bug)

    当一个对象被设置为另一个对象的事件过滤器时,它会先于被过滤对象接收事件,如果事件过滤器处理了这个事件,那么被过滤对象就不会再接收到这个事件。 首先,我们需要创建一个继承自`QObject`的类,然后重写`...

    QT.rar_QT5 学习_linux系统QT学习_qt5开发_qt5教程_site:www.pudn.com

    "Qt开发入门教程09_Qt事件.pdf"涉及Qt的事件模型,包括事件的派发、处理和过滤,这对于理解和调试事件驱动的代码至关重要。 "Qt开发入门教程10_Qt网络.pdf"将介绍如何使用Qt的网络模块进行HTTP请求、套接字通信等...

    Qt5学习之路2

    《Qt学习之路2》是一份全面介绍Qt开发的教程,旨在帮助读者从基础知识逐步过渡到Qt的高级特性,让初学者能够快速上手Qt开发,并为有经验的开发者提供深入学习的机会。通过对Qt4和Qt5两个版本的比较,本教程帮助读者...

    qt中的treeView的右击事件和双击事件

    在Qt中,你可以通过安装事件过滤器或者重载`viewportEvent()`方法来捕获鼠标右键点击事件。但更常见的是使用信号槽机制,连接`QTreeView`的`customContextMenuRequested()`信号。当用户在`QTreeView`上右键点击时,...

    qt学习之路

    ### Qt学习之路知识点详解 #### 一、前言:Qt简介及优势 - **Qt**是一种跨平台的应用程序开发框架,使用C++语言编写。它不仅支持Windows、Linux、macOS等主流操作系统,还能用于开发Android和iOS移动应用。Qt因其...

    Qt学习之路2 (基于Qt5.0.1共58章)

    21. 事件过滤器 22. 事件总结 23. 自定义事件 24. Qt 绘制系统简介 25. 画刷和画笔 26. 反走样 27. 渐变 28. 坐标系统 29. 绘制设备 30. Graphics View Framework 31. 贪吃蛇游戏(1) 32. 贪吃蛇游戏(2) 33. ...

    Qt事件处理,定时器

    4. **事件过滤器**:事件过滤器允许你在事件到达目标对象之前对其进行拦截。通过调用`installEventFilter()`方法,可以为对象安装一个事件过滤器,然后在过滤器对象的`eventFilter()`函数中处理事件。 5. **信号和...

Global site tag (gtag.js) - Google Analytics