今天我的截图工具Peek坏了,似乎是ffmpeg的锅。所以今天没有GIF演示了,我会把GIF可以表达的内容全部换成终端表达。
先看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 class Widget : public QWidget{ Q_OBJECT public : Widget (QWidget *parent = nullptr ); ~Widget (); private : Ui::Widget *ui; protected : bool eventFilter (QObject*, QEvent*) ; }; Widget::Widget (QWidget *parent) : QWidget (parent) , ui (new Ui::Widget) { ui->setupUi (this ); ui->pushButton->installEventFilter (this ); } Widget::~Widget () { delete ui; } bool Widget::eventFilter (QObject *ob, QEvent *ev) { if (ui->pushButton == ob) { if (ev->type () == QEvent::MouseButtonPress) { std::cout << "Filter has an effect." << std::endl; return true ; } } return QWidget::eventFilter (ob, ev); }
eventFilter返回一个bool类型,如果为true,代表该事件已经处理。 在这次代码中,我拦截了一个我自定义的button类的鼠标点击事件,而我这个自定义的button类设置了一个鼠标点击事件和一个进入事件:
1 2 3 4 5 6 7 8 9 10 void MyButton::mousePressEvent (QMouseEvent *ev) { std::cout << "Press" << std::endl; } void MyButton::enterEvent (QEvent *ev) { std::cout << "Enter!" << std::endl; }
然后我编译并运行程序,单击一下按钮,输出如下:
1 2 3 4 17:47:06: Starting /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 ... Enter! Filter has an effect. 17:47:13: /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 exited with code 0
这里触发”Enter”没有什么问题,一是因为我们没有拦截,二是因为想要点击按钮,鼠标必需要进入按钮的区域才行。 可以看到,与鼠标点击事件不相关的进入事件执行了,过滤器中的鼠标点击事件生效了,而我们定义的mosuePressEvent事件并没有生效,因为其在触发事件之前就已经被过滤器拦截了。 接下来我们修改过滤器,使得过滤器中的代码和我们定义的mousePressEvent事件都能触发:
1 2 3 4 5 6 7 8 9 10 11 12 bool Widget::eventFilter (QObject *ob, QEvent *ev) { if (ui->pushButton == ob) { if (ev->type () == QEvent::MouseButtonPress) { std::cout << "Filter has an effect." << std::endl; } } return QWidget::eventFilter (ob, ev); }
然后编译运行,并点击一次按钮,输出如下:
1 2 3 4 5 17:51:35: Starting /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 ... Enter! Filter has an effect. Press 17:51:41: /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 exited with code 0
可以看到,过滤器里的输出和mousePressEvent里的输出都输出出来了。而且过滤器里的输出顺序在Press之上,这也说明了过滤器是在事件触发之前就被触发的。 那么本篇博文到这里就结束了,没有Peek截GIF真难受。 本篇完。