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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)