Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

Qt事件的接收与忽略

事件对象有个接收标志,其为bool类型的accepted。这个标志(flag)决定了当前事件是否是需要的事件,如果不是需要的事件话,那么这个事件就会被父组件接收(注意,是父组件,不是父类)。当accepted为true的时候,其会被认为是需要的事件,如果是false,其会被认为是不需要的事件。使用QMouseEvent.accept()函数可以将其设置为true,使用QMouseEvent.ignore()可以将其设置为false。

而重写事件,会导致该事件对应的信号失效,因为信号就是在事件里发送的。解决方法就是在事件里手动发送信号。
那么我们先看重写事件导致的信号失效。

重写事件导致对应的信号失效

那么下面是代码例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// MyButton函数头文件
class MyButton:public QPushButton
{
Q_OBJECT
public:
explicit MyButton(QWidget* parent);
protected:
void mousePressEvent(QMouseEvent*);
};
// MyButton实现
#include "mybutton.h"

MyButton::MyButton(QWidget* parent):QPushButton(parent)
{
connect(this, &MyButton::clicked, [](){std::cout << "This button was clicked." << std::endl;});
}

void MyButton::mousePressEvent(QMouseEvent *ev)
{
std::cout << "Press!!" << std::endl;
ev->accept();
}

可以看到,我重写了mousePressEvent事件,在mousePressEvent事件里输出了”Press!!”,这样每当mousePressEvent被触发都会输出一次”Press!!”。ev->accept()的作用是将accepted标志设置为true,这样就不会触发父组件的对应事件了。而在构造函数里我连接了这个类的click信号和一个lambda定义的槽,每次点击的时候会输出:”This button was clicked.”。
那么我运行一下程序,并单击一次这个BUtton:

1
2
3
13:35:02: Starting /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 ...
Press!!
13:35:06: /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 exited with code 0

这是这个程序的输出。可以看到,mousePressEvent被触发了,但是clicked信号对应的槽函数并没有输出,所以clicked信号并没有被触发。原因我上面说过了,是因为我们重写了mousePressEvent,导致了对应的信号失效了。那么我们如何让这个信号正常工作呢?很简单,直接在事件函数里重新调用这个事件就好了:

1
2
3
4
5
6
void MyButton::mousePressEvent(QMouseEvent *ev)
{
std::cout << "Press!!" << std::endl;
clicked(); // 发送信号
ev->accept();
}

这是我运行程序并单击一次button的输出结果:

1
2
3
4
13:39:20: Starting /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 ...
Press!!
This button was clicked.
13:39:23: /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 exited with code 0

可以看到,这次clicked信号对应的槽函数也被触发了。

事件的接收与忽略

接下来我们来讲事件的接收与忽略,这是我的button的mousePressEvent:

1
2
3
4
5
void MyButton::mousePressEvent(QMouseEvent *ev)
{
std::cout << "Press!!" << std::endl;
ev->accept();
}

这是这个button父组件的mousePressEvent:

1
2
3
4
5

void Widget::mousePressEvent(QMouseEvent *event)
{
std::cout << "Father widget was pressed." << std::endl;
}

然后我运行程序并单击一下button:

1
2
3
13:44:44: Starting /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 ...
Press!!
13:44:48: /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 exited with code 0

这是程序的输出结果。
接下来我修改button的mousePressEvent函数,把accept()改成ignore():

1
2
3
4
5
void MyButton::mousePressEvent(QMouseEvent *ev)
{
std::cout << "Press!!" << std::endl;
ev->ignore();
}

然后再次运行程序并单击一次button:

1
2
3
4
13:47:40: Starting /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 ...
Press!!
Father widget was pressed.
13:47:43: /home/fire/codeSet/QtSet/build-untitled9-unknown-Debug/untitled9 exited with code 0

这是程序的输出结果。
可以看到,不只是button的mousePressEvent事件,其父组件的mousePressEvent也被触发了。
代码已经很清楚了。
本篇完。

评论



愿火焰指引你