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()。
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
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();
}
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓