Qt | 关于如何使用事件过滤器 eventFilter

简介: 学习使用事件过滤器。

前言:

Qt提供的事件过滤器是由两个函数组成的用来实现在一个部件中监控自己或其他多个部件的事件的一个操作。这两个函数分别是installEventFilter()和eventFilter(),都是QObject类中的函数。

使用方法:

1. 对需要监控的部件安装过滤器,例如:

ui->textEdit->installEventFilter(this);//为编辑部件在本窗口上安装事件过滤器

要对一个部件使用事件过滤器,就要先使用其的installEventFilter()函数为其安装事件过滤器,这个函数的参数表明了监视对象。参数为this表明要在本窗口/部件中监视textEdit的事件。

2. 在监视部件中重新实现eventFilter()函数:

  • bool eventFilter(QObject *obj, QEvent *event);
bool Widget::eventFilter(QObject *obj, QEvent event)
{
    if(obj == ui->textEdit)
    {
        if(event->type == QEvent::Wheel){
            return true;
        }
        else{
            return false;
        }
    }
    else{
        return QWidget::eventFilter(obj, event);
    }
}

obj为发生事件的对象,event为事件。

如果要对一个特定的事件进行处理,而且不希望它在后面的传递过程中再被处理,那么就返回true,否则返回false。如果不需要处理这个事件,那么久返回这个事件,交给上级部件处理。

为什么要使用过滤器:

有时候,我们需要监听多个部件的事件,如果不使用过滤器,那么就得分别子类化各个部件,然后重新实现它们对应的各个事件处理函数,这样做就会很麻烦,为了避免造成这种麻烦,直接将这些部件的事件在父窗口中进行监听并做相应的处理,就会很方便。

发送事件:

Qt中除了可以监听事件,也提供了发送一个事件的功能:

  • bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event);

  • void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority);

用过MFC的童鞋看到这两个函数应该会联想到SendMessage和PostMessage吧,它们确实是类似的。

sendEvent和postEvent的区别:

  • sendEvent()会立即处理给定的事件;而postEvent()则会将事件放到等待调度队列中,当下一次Qt的主事件循环运行时才会处理它。
  • sendEvent()中的QEvent队形参数在事件发送完成后无法自动删除,所以需要在栈上创建QEvent对象;而postEvent()中的QEvent对象参数必须在堆上进行创建(例如使用new),当事件被发送后事件队列会自动删除它。

发送一个事件:

QKeyEvent myEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModify);
qApp->sendEvent(ui->spinBox, &myEvent);//发送键盘事件到spinbox部件

这里的qApp是QApplication对象的全局指针,每一个应用程序只能使用一个QApplication对象,等价于使用QApplication::sendEvent()。

Qt还可以使用自定义的事件,这个事件需要继承QEvent类。

目录
相关文章
|
5月前
|
存储 开发框架 开发者
QT C++焦点事件:多角度解析实用技巧与方法
QT C++焦点事件:多角度解析实用技巧与方法
1123 0
|
5月前
|
API
QT基础入门——Qt事件(五)
QT基础入门——Qt事件(五)
294 0
QT基础入门——Qt事件(五)
|
12天前
|
存储 Windows
(13) Qt事件系统(two)
文章详细介绍了Qt事件系统,包括事件分发、自定义事件、事件传播机制、事件过滤以及事件与信号的区别。
38 3
(13) Qt事件系统(two)
|
12天前
|
编解码 程序员
(12)Qt事件系统(one)
本文详细介绍了Qt事件系统,包括各种系统事件、鼠标事件、键盘事件、定时器等的处理方法和示例代码。
38 0
(12)Qt事件系统(one)
|
2月前
|
开发者
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
164 4
|
4月前
Qt事件分发器、事件过滤器
Qt事件分发器、事件过滤器
|
3月前
|
开发者
Qt中的事件该如何学习?(附带案例)
事件是Qt中比较重要的一部分,在初期如果理解不当学习可能会比较困难,这里提一嘴当初教我的那位老师水平是真的高,让我很轻易的就理解了事件的概念。 在平时我们见到那些界面上的某些快捷键就有可能是事件做的,例如ESC关闭窗口,Enter提交或者登录这种类似的,这也是事件的强大之处。
|
5月前
|
开发框架 算法 程序员
【Qt 元对象系统】深入探索Qt事件过滤:从基础到高级应用
【Qt 元对象系统】深入探索Qt事件过滤:从基础到高级应用
147 7
|
5月前
|
测试技术 数据库 C++
Qt C++拖放事件探索之旅:多方法深入解析
Qt C++拖放事件探索之旅:多方法深入解析
451 1
|
5月前
|
C++
qt事件过滤器的使用(可以用于控制屏幕背光等)
qt事件过滤器的使用(可以用于控制屏幕背光等)
106 0