前言

用了这么久 Qt 了,accept() 和 ignore(), 这两个方法总是分不清,今天通过自己写 demo,目前分清了希望不要忘记  ^__^ 。
accept 和 ignore 使用场景有点类似 js 中事件冒泡即子元素点击了父元素是否需要响应。不过 Qt 和 js 的默认是否响应的方式却是不同。
js 中,默认情况下子元素点击后,父元素会触发默认的点击事件的,如果不想父元素触发 js 中也是有方法可以解决的,由于今天讨论的是 Qt 的东西,js 的就先不管(如果有使用 js 的同学看到这里,
可以去百度:js 事件冒泡,记住 js 阻止冒泡方式和 jq 阻止冒泡方式不同)。

 Qt accept 和 ignore demo 讲解

思路

1.  首先在主界面中拖入一个 QPushButton;

2.  新建一个类 MyButton,继承自 QPushButton,其中重写 QPushButton 的“mousePressEvent”事件,并随便打印一句话;

3. 到主界面中选中 QPushButton,右键点击提升为,将当前 QPushButton 提升为 MyButton。

4. 重写主界面的"mousePressEvent" 事件,并打印一句话区别于按钮的打印的语句。

5. 点击按钮,查看打印的语句。

 Qt accept 和 ignore demo 实现

MyButton 类

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QWidget>
#include <QPushButton>
#include <QMouseEvent>
#include <QDebug>

class MyButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = nullptr);

signals:

public slots:


protected:
    void mousePressEvent(QMouseEvent *event);
};

#endif // MYBUTTON_H
#include "mybutton.h"

MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{

}


// 此处默认为 event->accept(); 类似于冒泡(event->ignore) 阻止冒泡(event->accept())
void MyButton::mousePressEvent(QMouseEvent *event)
{
   qDebug() << "[" << __FUNCTION__ <<__LINE__ << "] :" << event;
   event->ignore();

   //QPushButton::mousePressEvent(event);
}

MainWindow 方法实现

Qt Accept和Ignore讲解_c/c

按钮提升

Qt Accept和Ignore讲解_c/c_02

总结

通过此例发现: Qt 默认使用: event->accept(),如果不使用 accept 而使用 ignore 会造成子控件的事件会向上传递到父控件(js 中事件冒泡),如果这个相当于父控件下子控件点击都会触发父控件点击事件,仔细想想肯定不合理的。

如果区分 accept 和 ignore 呢?
因为我经常忘记: accept 可以看成是事件拦截,拦截后事件是不向上传递;ignore 与之相对应。