工程项目网站,开源app开发工具,唐山丰南建设局网站,深圳高端租车公司很高兴在雪易的CSDN遇见你 #xff0c;给你糖糖
欢迎大家加入雪易社区-CSDN社区云 前言
本文分享QT中的事件Event技术#xff0c;主要从QT事件流程和常用QT事件方法等方面展开#xff0c;希望对各位小伙伴有所帮助#xff01;
感谢各位小伙伴的点赞关注#xff0c;小易…很高兴在雪易的CSDN遇见你 给你糖糖
欢迎大家加入雪易社区-CSDN社区云 前言
本文分享QT中的事件Event技术主要从QT事件流程和常用QT事件方法等方面展开希望对各位小伙伴有所帮助
感谢各位小伙伴的点赞关注小易会继续努力分享一起进步
你的点赞就是我的动力()ノ~ 目录
前言
1. QEvent事件概述
2.代码说明事件执行流程
QApplication的notify函数
eventTestWidget zxWidget的eventFilter函数
问题1子级执行了mousePressEvent而父级未执行
问题2如何在notify进行事件拦截
问题3如何在eventFilter中进行事件拦截
问题4如何在event中进行拦截
结论 1. QEvent事件概述 QEvent是QT中所有事件的基类包括鼠标事件、键盘事件、QPaintEvent重绘事件、Timer事件、Drop事件。 事件的执行过程由QApplication对象的exec事件循环监听整个界面中所有控件的发生的事件Event。当某个控件产生相关事件后QApplication对象会执行notify函数向此控件发送通知。控件收到事件通知后会进行事件过滤eventFilter和事件分发event最后到达事件处理函数。
2.代码说明事件执行流程
以Widget为例进行说明 QApplication的notify函数 重写notify函数
bool zxApplication::notify(QObject *obj, QEvent *e)
{if(e-type() QEvent::MouseButtonPress){qDebug()notify: obj-objectName() e-type()endl;//return true;}return QApplication::notify(obj, e);
}
eventTestWidget
void eventTestWidget::mousePressEvent(QMouseEvent *ev)
{qDebug()eventTestWidget::mousePressEvent endl;
}bool eventTestWidget::event(QEvent *event)
{qDebug()eventTestWidget::event event-type()endl;return QWidget::event(event);
}bool eventTestWidget::eventFilter(QObject *obj, QEvent *ev)
{if(obj ui-widget ev-type()QEvent::MouseButtonPress){qDebug()eventTestWidget::eventFilter widget ev-type()endl;return false;}return QWidget::eventFilter(obj, ev);
} zxWidget的eventFilter函数 重写eventFilter函数
void zxWidget::mousePressEvent(QMouseEvent *ev)
{qDebug()zxWidget::mousePressEvent endl;QWidget::mousePressEvent(ev);
}bool zxWidget::event(QEvent *event)
{qDebug()zxWidget::event event-type()endl;return QWidget::event(event);
}bool zxWidget::eventFilter(QObject *obj, QEvent *ev)
{if(ev-type()QEvent::MouseButtonPress){qDebug()zxWidget::eventFilter ev-type()endl;return false;}return QWidget::eventFilter(obj, ev);
} 当在widget中点击鼠标左键时触发
//第一步Application的notify,接收到 mouseBottonPress事件顺序父级-》子级
notify: eventTestWidgetWindow QEvent::MouseButtonPress notify: widget QEvent::MouseButtonPress //第二步父级窗口eventFilter执行事件过滤
eventTestWidget::eventFilter widget QEvent::MouseButtonPress //第三步子级窗口event执行事件分发
zxWidget::event QEvent::MouseButtonPress //第四步子级窗口执行事件
zxWidget::mousePressEvent
问题1子级执行了mousePressEvent而父级未执行
解决方案添加event-ignore();表示将事件继续传输给父级节点。
void zxWidget::keyPressEvent(QKeyEvent *event)
{qDebug() this-objectName() keyPressendl;QWidget::keyPressEvent(event);event-ignore();
}
此时的输出 notify: eventTestWidgetWindow QEvent::MouseButtonPress notify: widget QEvent::MouseButtonPress eventTestWidget::eventFilter widget QEvent::MouseButtonPress zxWidget::event QEvent::MouseButtonPress zxWidget::mousePressEvent eventTestWidget::event QEvent::MouseButtonPress eventTestWidget::mousePressEvent 问题2如何在notify进行事件拦截
解决方案筛选出指定事件后返回True
bool zxApplication::notify(QObject *obj, QEvent *e)
{if(e-type() QEvent::MouseButtonPress){qDebug()notify: obj-objectName() e-type()endl;return true;}return QApplication::notify(obj, e);
}
此时输出 notify: eventTestWidgetWindow QEvent::MouseButtonPress *若在QApplication的notify函数中对某个事件进行了拦截则eventFilter中不会在接收到此函数。子对象也不会接收到该事件的通知。 问题3如何在eventFilter中进行事件拦截
解决方案
bool eventTestWidget::eventFilter(QObject *obj, QEvent *ev)
{if(obj ui-widget ev-type()QEvent::MouseButtonPress){qDebug()eventTestWidget::eventFilter widget ev-type()endl;return true;}return QWidget::eventFilter(obj, ev);
}
此时输出 notify: eventTestWidgetWindow QEvent::MouseButtonPress notify: widget QEvent::MouseButtonPress eventTestWidget::eventFilter widget QEvent::MouseButtonPress *在父级的eventFilter中进行事件拦截则该事件不会传输至子对象。 问题4如何在event中进行拦截
解决方法
bool zxWidget::event(QEvent *event)
{qDebug()zxWidget::event event-type()endl;if(event-type()QEvent::MouseButtonPress){return true;}return QWidget::event(event);
}
此时输出 notify: eventTestWidgetWindow QEvent::MouseButtonPress notify: widget QEvent::MouseButtonPress eventTestWidget::eventFilter widget QEvent::MouseButtonPress zxWidget::event QEvent::MouseButtonPress *在事件分发时进行事件拦截故而没有执行该事件。 结论 该文主要介绍了QT中事件的传输和拦截机制。
关联资源QT开发Event事件机制事件监控、传输、过滤和分发机制资源-CSDN文库
小伙伴可以联系我获取哦
感谢各位小伙伴的点赞关注小易会继续努力分享一起进步
你的赞赏是我的最最最最大的动力()ノ~