Qt事件的接收与忽略
事件对象有个接收标志,其为bool类型的accepted。这个标志(flag)决定了当前事件是否是需要的事件,如果不是需要的事件话,那么这个事件就会被父组件接收(注意,是父组件,不是父类)。当accepted为true的时候,其会被认为是需要的事件,如果是false,其会被认为是不需要的事件。使用QMouseEvent.accept()函数可以将其设置为true,使用QMouseEvent.ignore()可以将其设置为false。
而重写事件,会导致该事件对应的信号失效,因为信号就是在事件里发送的。解决方法就是在事件里手动发送信号。
那么我们先看重写事件导致的信号失效。
重写事件导致对应的信号失效
那么下面是代码例子:
1 | // MyButton函数头文件 |
可以看到,我重写了mousePressEvent事件,在mousePressEvent事件里输出了”Press!!”,这样每当mousePressEvent被触发都会输出一次”Press!!”。ev->accept()的作用是将accepted标志设置为true,这样就不会触发父组件的对应事件了。而在构造函数里我连接了这个类的click信号和一个lambda定义的槽,每次点击的时候会输出:”This button was clicked.”。
那么我运行一下程序,并单击一次这个BUtton:
1 | 13:35:02: Starting /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 ... |
这是这个程序的输出。可以看到,mousePressEvent被触发了,但是clicked信号对应的槽函数并没有输出,所以clicked信号并没有被触发。原因我上面说过了,是因为我们重写了mousePressEvent,导致了对应的信号失效了。那么我们如何让这个信号正常工作呢?很简单,直接在事件函数里重新调用这个事件就好了:
1 | void MyButton::mousePressEvent(QMouseEvent *ev) |
这是我运行程序并单击一次button的输出结果:
1 | 13:39:20: Starting /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 ... |
可以看到,这次clicked信号对应的槽函数也被触发了。
事件的接收与忽略
接下来我们来讲事件的接收与忽略,这是我的button的mousePressEvent:
1 | void MyButton::mousePressEvent(QMouseEvent *ev) |
这是这个button父组件的mousePressEvent:
1 |
|
然后我运行程序并单击一下button:
1 | 13:44:44: Starting /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 ... |
这是程序的输出结果。
接下来我修改button的mousePressEvent函数,把accept()改成ignore():
1 | void MyButton::mousePressEvent(QMouseEvent *ev) |
然后再次运行程序并单击一次button:
1 | 13:47:40: Starting /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 ... |
这是程序的输出结果。
可以看到,不只是button的mousePressEvent事件,其父组件的mousePressEvent也被触发了。
代码已经很清楚了。
本篇完。