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;}

8049

被折叠的 条评论
为什么被折叠?



