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行注释,单击按钮后,窗口立即消失。
欢迎交流。
原文:https://www.cnblogs.com/112358nizhipeng/p/9379806.html