目录
1.事件过滤器2.示例3.简单分析1.事件过滤器
void QObject::installEventFilter(QObject *filterObj)
bool eventFilter(QObject *obj, QEvent *event);
Qt的事件过滤由以上两个方法实现,首先安装一个事件过滤器,然后重写bool eventFilter(QObject *obj, QEvent *event)。
filterObj表示事件筛选器对象,它接收发送到此QObject对象的所有事件。筛选器可以停止事件,也可以将事件转发给此QObject对象。事件过滤器filterObj通过它的eventFilter()函数接收事件。
eventFilter()有返回值。
如果返回true,表示事件过滤,不会发送到对象本身。如果返回false,表示事件未过滤,会通过event()方法将事件分发到对象。返回给基类进行处理,例:return QObject::eventFilter(obj, event)。2.示例
一个label,当鼠标进入的时候变成红色,鼠标离开的时候变为黑色
#include "widget.h" #include "ui_widget.h" QString redStyle = "QLabel#label{color:#FF0000}"; QString blackStyle = "QLabel#label{color:#000000}"; Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); ui->label->installEventFilter(this); } Widget::~Widget() { delete ui; } bool Widget::eventFilter(QObject *obj, QEvent *event) { if(obj == ui->label) { //鼠标进入的时候 if (event->type() == QEvent::Enter) { ui->label->setText("我是红色"); ui->label->setStyleSheet(redStyle); return true; } else if(event->type() == QEvent::Leave) //鼠标离开 { ui->label->setText("我是黑色"); ui->label->setStyleSheet(blackStyle); return true; } return false;//别的事件会传给label对象 } // standard event processing return QWidget::eventFilter(obj, event); }
上述代码,假如我们不使用事件过滤器,我们就无法实现上述鼠标进入、离开功能,只能自己继承QLabel,重写鼠标进入、离开事件。
3.简单分析
自定义一个label类继承QLabel,查看事件的处理顺序,以及过滤器是否起作用。
#ifndef WLABEL_H #define WLABEL_H #include#include class WLabel : public QLabel { public: WLabel(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); protected: virtual bool event(QEvent *e); virtual void enterEvent(QEvent *event); virtual void leaveEvent(QEvent *event); }; #endif // WLABEL_H #include "wlabel.h" #include WLabel::WLabel(QWidget *parent, Qt::WindowFlags f) : QLabel(parent,f) { } bool WLabel::event(QEvent *e) { if(e->type() == QEvent::Enter) { qDebug()<<"WLabel event :enter"; } else if(e->type() == QEvent::Leave) { qDebug()<<"WLabel event :Leave"; } return QLabel::event(e); } void WLabel::enterEvent(QEvent *event) { qDebug()<<"WLabel enterEvent"; } void WLabel::leaveEvent(QEvent *event) { qDebug()<<"WLabel leaveEvent"; }
自己定义了一个WLabel类,重写了event事件,鼠标进入事件enterEvent,鼠标离开事件leaveEvent。
然后将之前界面上的QLabel提升为我们现在定义的类。
如果在bool Widget::eventFilter(QObject *obj, QEvent *event)方法中,将我们鼠标进入离开事件返回false后,事件会发送到Label本身,如下图所示。
结论:事件的派发顺序是先进入eventFilter中,看是否过滤掉此事件,然后进入到bool WLabel::event(QEvent *e)事件中,由event去分发事件,最后进入到enterEvent(QEvent *event)或者void leaveEvent(QEvent *event);
到此这篇关于Qt 事件过滤器的具体实现的文章就介绍到这了,更多相关Qt 事件过滤器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
上一篇:Android自定义双向滑动控件
下一篇:C语言图文并茂详解链接过程
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?