qt-事件的接受和忽略

1、事件可以被接受或忽略,被接受的事件不会再传递给其他对象,被忽略的事件会被传递给其他对象处理,或者该事件被丢弃(即没有对象处理该事件)
2、使用 QEvent::accept()函数表示接受一个事件,使用 QEvent::ignore()函数表示忽略一个事件。也就是说若调用 accept(),则事件不会传递给父对象若调用 ignore()则事件会向父对象传递
3、Qt 默认值是 accept (接受事件),但在 QWidget 的默认事件处理函数(比如 keyPressEvent())中,默认值是ignore(),因为这样可实现事件的传递(即子对象未处理就传递给父对象处理)。对事件的接受和忽略,最好是明确的调用 accept()和 ignore 函数
个人理解:只有控件的基类QWidget默认值是ignore(),其子类控件默认还是accept 
4、在 event()函数中调用 accept()或 ignore()是没有意义的,event()函数通过返回一个 bool 值来告诉调用者是否接受了事件(true 表示接受事件)。是否调用 accept()是用于事件处理函数与 event()函数之间通信的,而 event()函数返回的 bool 值是用于与 QApplication::notify()函数之间通信的
5、注意:QCloseEvent(关闭事件)有一些不同,QCloseEvent::ignore()表示取消关闭操作,而QCloseEvent::accept()则表示让 Qt 继续关闭操作。为避免产生混淆,最好在 closeEvent()处理函数的重新实现中显示地调用 accept()和 ignore()。
 
c.h文件
#ifndef C_H
#define C_H

#include <QPushButton>
#include <QDebug>
#include<QMouseEvent>  //鼠标模块

class C : public QPushButton
{
public:
    C();
    void mousePressEvent(QMouseEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);
    void keyPressEvent(QKeyEvent* e);
    void keyReleaseEvent(QKeyEvent* e);



};


#endif // C_H

c.cpp文件

#include "c.h"

C::C()
{

}

void C::mousePressEvent(QMouseEvent *e)
{
    qDebug()<<"C按下了鼠标:";
    e->accept();  //验证事件被接受后不会再被传递给父对象
}

void C::mouseReleaseEvent(QMouseEvent *e)
{
    qDebug()<<"C释放了鼠标:";
    //QWidget::mouseReleaseEvent(e); //验证默认为接受事件


}

void C::keyPressEvent(QKeyEvent *e)
{
    qDebug()<<"C按下了键盘:";
    e->ignore(); //验证事件被忽略后会被传递给父对象
}

void C::keyReleaseEvent(QKeyEvent *e)
{
    qDebug()<<"C释放了键盘:";
                          //验证Qt的默认处理方式为接受事件(此处未明确调用accept()或ignore()函数
}

win.h文件

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QDebug>
#include "c.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Win; }
QT_END_NAMESPACE

class Win : public QWidget
{
    Q_OBJECT

public:
    Win(QWidget *parent = nullptr);
    ~Win();
    //重写以下事件处理函数
    void mousePressEvent(QMouseEvent *e);//鼠标按下
    void mouseReleaseEvent(QMouseEvent *e); //鼠标释放
    void keyPressEvent(QKeyEvent* e);  //键盘按下
    void keyReleaseEvent(QKeyEvent* e);//键盘释放


private:
    Ui::Win *ui;
    C* mc;

};

#endif // WIN_H

win.cpp文件

#include "win.h"
#include "ui_win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Win)
{
    ui->setupUi(this);

    mc=new C();
    mc->setParent(this);
    mc->setText("AAA");
    mc->move(22,22);

}

Win::~Win()
{
    delete ui;
}

void Win::mousePressEvent(QMouseEvent *e)
{
    qDebug()<<"win按下了鼠标:";
}

void Win::mouseReleaseEvent(QMouseEvent *e)
{
    qDebug()<<"win释放了鼠标:";
}

void Win::keyPressEvent(QKeyEvent *e)
{
    qDebug()<<"win按下了键盘:";
}

void Win::keyReleaseEvent(QKeyEvent *e)
{
    qDebug()<<"win释放了键盘:";
}

main.cpp文件

#include "win.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Win w;
    w.show();
    return a.exec();
}

以上工程下载地址:链接:https://pan.baidu.com/s/1PpDWWKwIGvdbSD_qVaxGPA      提取码:6666    

原文地址:https://www.cnblogs.com/liming19680104/p/13708108.html