Qt中事件处理有多种方法,但各有优缺点,下面将通过举例说明当多种事件方法都定义时系统调用的优先级(先总结后面实例可复制 去实现):
通过下面的源代码运行结果:
QApplication::EventFiletr Working
EventFilter Working
Event Working
MousePressEvent Working
可知系统对事件调用的优先级为:
1.全局事件过滤器
2.对象事件过滤器
3.event()函数
4.具体事件处理函数
下面贴代码:
//main.cpp
#include "widget.h"
#include <QApplication>
#include"eventfilter.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.installEventFilter(new EventFilter(&w,&w));
w.show();
return a.exec();
}
///
//widget.h
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include<QEvent>#include<QMouseEvent>class Widget : public QWidget{
Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();bool eventFilter(QObject *,QEvent *);protected:void mousePressEvent(QMouseEvent *event);bool event(QEvent *event);};
#endif // WIDGET_H///
//widget.cpp
#include "widget.h"#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent){
this->installEventFilter(this);}
bool Widget::eventFilter(QObject *watched,QEvent *event){
if(watched == this){if(event->type() == QEvent::MouseButtonPress){qDebug() << "EventFilter Working";}}return false;}
void Widget::mousePressEvent(QMouseEvent *event){
qDebug() << "MousePressEvent Working";}
bool Widget::event(QEvent *event){
if(event->type() == QEvent::MouseButtonPress)qDebug() << "Event Working";return QWidget::event(event);}
Widget::~Widget(){
}
///
//eventfilter.h
#ifndef EVENTFILTER_H#define EVENTFILTER_H#include<QObject>#include<QEvent>#include<QDebug>class EventFilter:public QObject{
public:EventFilter(QObject *watched,QObject *parent = 0):QObject(parent),m_watched(watched){}~EventFilter(){}bool eventFilter(QObject *,QEvent *);private:QObject *m_watched;};
#endif // EVENTFILTER_H///
//eventfilter.h
#include"eventfilter.h"bool EventFilter::eventFilter(QObject *watched,QEvent *event){
if(watched == m_watched){if(event->type() == QEvent::MouseButtonPress)qDebug() << "QApplication::EventFiletr Working";}return false;}