Qt5学习笔记(消息过滤器)

T06EventFilter.pro

1 HEADERS += \
2     MyWidget.h
3 
4 SOURCES += \
5     MyWidget.cpp
6 
7 QT += widgets gui

MyWidget.h

 1 #ifndef MYWIDGET_H
 2 #define MYWIDGET_H
 3 
 4 #include <QWidget>
 5 #include <QPushButton>
 6 class MyWidget : public QWidget
 7 {
 8     Q_OBJECT
 9 public:
10     explicit MyWidget(QWidget *parent = nullptr);
11     QPushButton* _button;
12     bool eventFilter(QObject *, QEvent *);//原型
13 signals:
14 
15 public slots:
16 };
17 
18 #endif // MYWIDGET_H

MyWidget.cpp

 1 #include "MyWidget.h"
 2 #include <QPushButton>
 3 #include <QEvent>
 4 MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
 5 {
 6     QPushButton* button;
 7     button = new QPushButton("This button", this);
 8     connect(button, SIGNAL(clicked()), this, SLOT(close()));
 9 
10     _button = button;
11     /*button给自己安装了一个消息过滤器,经过button的消息,都先要调用它的过滤器eventFilter函数*/
12     button->installEventFilter(this);
13 }
14 
15 bool MyWidget::eventFilter(QObject *o, QEvent *e)//o谁的,e什么消息(对象,事件)
16 {
17 
18     //(对象,事件)
19     if (o == (QObject*)_button &&
20             (e->type() == QEvent::MouseButtonPress ||
21             e->type() == QEvent::MouseButtonRelease ||
22              e->type() == QEvent::MouseButtonRelease ))//截断,单击,双击,不发生反应
23     {
24         return true;
25     }
26 
27     return QWidget::eventFilter(o, e);
28 }
29 #include <QApplication>
30 int main(int argc, char* argv[])
31 {
32     QApplication app(argc, argv);
33 
34     MyWidget w;
35     w.show();
36 
37     return app.exec();
38 }

消息被过滤,单击,双击都没有反应。

如果将17~26行注释,单击按钮后,窗口立即消失。

欢迎交流。

扫描二维码关注公众号,回复: 2416185 查看本文章

猜你喜欢

转载自www.cnblogs.com/112358nizhipeng/p/9379806.html