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学习之路2》中也会介绍如何通过覆盖event()函数来处理事件,以及如何使用事件过滤器进行事件的过滤和拦截,这些内容对于编写响应式和交互性强的应用程序非常重要。 最后,Qt还提供了文件操作相关的组件和类,如...
### Qt学习之路知识点总结 #### 一、基础知识与入门 - **Hello, World!** - **知识点**:Qt环境搭建、第一个Qt程序编写、基本的窗口显示。 - **重要性**:作为Qt初学者的第一课,通过简单的示例程序帮助理解Qt的...
标题《QT学习之路》指明了文档的主要内容,即向读者介绍如何学习Qt这一跨平台的C++图形用户界面应用程序开发框架。Qt是一个功能强大的工具,能够用来开发具有图形用户界面的应用程序,并且支持多种操作系统平台,如...
- **背景**: 本文档是基于作者之前的一个系列教程——《Qt学习之路》的更新版本,旨在适应Qt的新版本和发展趋势。 - **目的**: 更新和完善原有教程内容,使其更适合Qt 4.x和即将到来的Qt 5的学习需求。 - **定位**: ...
QT 事件学习 本文档主要探讨 QT 事件处理机制,内容从浅到深,涵盖了 QT 事件的产生、处理和派发机制。...QT 事件处理机制是程序运行的主线,QT 事件的产生、处理和派发机制都是通过事件循环和事件过滤器实现的。
### Qt学习之路知识点总结 #### 一、前言:Qt简介与选择 - **Qt**是一种跨平台的应用程序开发框架,广泛应用于桌面、移动设备及嵌入式系统的GUI应用程序开发。 - C++的GUI编程并非C++标准的一部分,因此开发者在...
在QT中,文件操作是核心功能之一,而事件过滤器和鼠标移动事件则是实现交互式应用程序的关键技术。 首先,让我们深入理解QT中的文件操作。QT库提供了丰富的类和函数,如`QFile`、`QTextStream`、`QDir`等,用于读取...
### Qt学习之路 绝对经典 #### 一、前言:C++ GUI编程的选择与Qt简介 在C++的世界里,GUI(图形用户界面)编程并非语言标准的一部分,这与Java有所不同,在Java中,开发者可以选择AWT/Swing或SWT/JFace等标准库来...
21. 事件过滤器 22. 事件总结 23. 自定义事件 24. Qt 绘制系统简介 25. 画刷和画笔 26. 反走样 27. 渐变 28. 坐标系统 29. 绘制设备 30. Graphics View Framework 31. 贪吃蛇游戏(1) 32. 贪吃蛇游戏(2) 33. ...
《Qt学习之路》是一份适合初学者的Qt入门教程,内容包括基础知识点到较为深入的GUI开发技术。其内容丰富,讲解细致,旨在帮助开发者从零开始,逐步深入掌握Qt框架,最终能够独立编写跨平台的应用程序。 1. 前言 ...
当一个对象被设置为另一个对象的事件过滤器时,它会先于被过滤对象接收事件,如果事件过滤器处理了这个事件,那么被过滤对象就不会再接收到这个事件。 首先,我们需要创建一个继承自`QObject`的类,然后重写`...
"Qt开发入门教程09_Qt事件.pdf"涉及Qt的事件模型,包括事件的派发、处理和过滤,这对于理解和调试事件驱动的代码至关重要。 "Qt开发入门教程10_Qt网络.pdf"将介绍如何使用Qt的网络模块进行HTTP请求、套接字通信等...
《Qt学习之路2》是一份全面介绍Qt开发的教程,旨在帮助读者从基础知识逐步过渡到Qt的高级特性,让初学者能够快速上手Qt开发,并为有经验的开发者提供深入学习的机会。通过对Qt4和Qt5两个版本的比较,本教程帮助读者...
在Qt中,你可以通过安装事件过滤器或者重载`viewportEvent()`方法来捕获鼠标右键点击事件。但更常见的是使用信号槽机制,连接`QTreeView`的`customContextMenuRequested()`信号。当用户在`QTreeView`上右键点击时,...
### Qt学习之路知识点详解 #### 一、前言:Qt简介及优势 - **Qt**是一种跨平台的应用程序开发框架,使用C++语言编写。它不仅支持Windows、Linux、macOS等主流操作系统,还能用于开发Android和iOS移动应用。Qt因其...
21. 事件过滤器 22. 事件总结 23. 自定义事件 24. Qt 绘制系统简介 25. 画刷和画笔 26. 反走样 27. 渐变 28. 坐标系统 29. 绘制设备 30. Graphics View Framework 31. 贪吃蛇游戏(1) 32. 贪吃蛇游戏(2) 33. ...
4. **事件过滤器**:事件过滤器允许你在事件到达目标对象之前对其进行拦截。通过调用`installEventFilter()`方法,可以为对象安装一个事件过滤器,然后在过滤器对象的`eventFilter()`函数中处理事件。 5. **信号和...