前言:
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类。