当前位置: 首页 > news >正文

37、三种事件处理方式优先级---------事件系统

三种事件处理方式优先级

我们学习了三种是事件处理方式
1重写event函数
2重写具体的事件函数
3重写事件过滤器并安装
那么这三种方式,调用的顺序会怎么样呢?
我们还是在MainWindow中创建一个按钮,然后用三种方式捕获这个按钮的点击事件,并弹出对应的信息。看看触发顺序

class MyButton: public QPushButton { Q_OBJECT public: //构造函数 explicit MyButton(const QString &text, QWidget *parent = nullptr): QPushButton(text,parent){ //装载事件过滤器 this->installEventFilter(this); } //重写鼠标点击事件 void mousePressEvent(QMouseEvent *e) override { QMessageBox::information(nullptr, "mousePressEvent", "mousePressEvent triggered!"); return QPushButton::mousePressEvent(e); } //重写event事件 bool event(QEvent *e) override { //判断是鼠标按下事件 if(e->type() == QEvent::MouseButtonPress){ QMessageBox::information(nullptr,"event triggered", "event MouseButtonPress triggered"); //返回false,表示未处理完全,可以继续交给父节点处理鼠标按下事件 return false; } //不是鼠标按下事件可以调用基类处理方式 return QPushButton::event(e); } //重写事件过滤器 virtual bool eventFilter(QObject *watched, QEvent *event){ //判断是不是鼠标按下事件 if(event->type() == QEvent::MouseButtonPress){ //弹出消息框表示事件过滤器捕获 QMessageBox::information(nullptr,"eventFilter triggered", "eventFilter MouseButtonPress triggered"); //返回false,表示未处理完全,交给按钮的其他处理机制捕获 return false; } return QPushButton::eventFilter(watched, event); } };

可以看到event中捕获了鼠标按下事件,为了让事件继续抛给按钮的父节点处理,我们选择了返回false。

我们在main函数中调用

int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; //创建按钮 auto button = new MyButton("Click Me", &w); button->setGeometry(100,100,100,50); w.show(); return a.exec(); }

运行后点击按钮,发现依次弹出两个信息框,没有触发mousePressEvent函数

可以看出触发的顺序是eventFilter, 然后才是event.

那同学们思考下,为什么没有触发mousePressEvent吗?

因为mousePressEvent是一个虚函数,虚函数是通过基类指针调用,进而调用子类实现的,这是多态,基类调用mousePressEvent也是通过基类的event进行派发的,而我们看到在event处理函数中我们判断是鼠标点击事件后返回的是false,也就不交给基类处理了,导致无法通过基类调用派发子类功能。

所以我们将event捕获到鼠标点击事件后不再直接返回,而是继续调用基类QPushButton的event函数,进而调用基类的mousePressEvent,最后通过多态效果触发我们自己实现的mousePressEvent

//重写event事件 bool event(QEvent *e) override { //判断是鼠标按下事件 if(e->type() == QEvent::MouseButtonPress){ QMessageBox::information(nullptr,"event triggered", "event MouseButtonPress triggered"); //不返回继续调用基类的事件派发机制 } //不是鼠标按下事件可以调用基类处理方式 return QPushButton::event(e); }

这样再次调用就能看到依次弹出三个消息框

http://www.jsqmd.com/news/595224/

相关文章:

  • OpenClaw备份策略:Qwen3-4B模型配置与技能数据的定期归档
  • STC32G144K开源库实战:智能车竞赛中的高效开发指南
  • Qwen3-4B-Thinking-GGUF快速上手:5分钟启动vLLM服务并接入Chainlit前端
  • ccmusic-database快速部署:Conda环境隔离安装torch+gradio无冲突指南
  • 2026年评价高的江苏静音柴油发电机/江苏低噪音柴油发电机/珀金斯柴油发电机/潍柴柴油发电机厂家综合实力参考(2026) - 品牌宣传支持者
  • AI 的梦幻编程
  • PowerPC P2040启动流程详解:从NOR Flash到U-Boot的完整引导过程
  • OpenClaw硬件加速:Qwen3.5-9B-AWQ-4bit在CUDA设备性能翻倍方案
  • AudioSeal保姆级教学:Gradio界面多文件批量上传与异步检测队列设置
  • OpenClaw+千问3.5-9B成本优化:夜间定时任务实战
  • OpenClaw低成本方案:Qwen3-14B私有镜像替代OpenAI API实战
  • 2026年口碑好的潍柴发电机/玉柴发电机实力厂家是谁 - 品牌宣传支持者
  • 手把手教你用STM32F103C8T6+ESP8266做个智能交通灯(附完整代码和电路图)
  • RK3568的Type-C接口设计,不止正反插:EMC防护、限流与关机遥控的细节实战
  • PP-DocLayoutV3效果对比:传统YOLOv8 vs PP-DocLayoutV3在倾斜文档精度PK
  • Ollama+Qwen2.5-VL-7B:快速搭建智能客服,实现图片问答与内容理解
  • 碧蓝航线Alas脚本新手通关指南:从安装到精通的4个关键阶段
  • 别再乱设波特率了!FPGA设计UART接收机,这3个容差陷阱你踩过吗?
  • 011、性能建模与容量规划
  • SEO 项目如何进行链接建设_SEO 项目如何进行品牌形象优化
  • Vant 3.x 日历组件与时间选择器联动实战:从零封装一个完整的日期时间选择组件
  • 2026年评价高的热管式余热锅炉/燃气锅炉/锅炉/外置式余热锅炉用户口碑认可参考(高评价) - 品牌宣传支持者
  • Llama-3.2V-11B-cot参数详解:官方最优推理配置+冲突参数自动剔除机制说明
  • 别再到处找教程了!嘉立创EDA专业版画STM32最小系统,这份保姆级指南就够了
  • 月之暗面赴港上市:一场从“不着急“到“抢窗口“的战略急转弯
  • rust 1.94.1 最新更新:修复 wasm32-wasip1-threads 线程问题、回滚 Windows OpenOptionsExt 新方法、修复 Clippy ICE、Cargo 升级
  • 别再手动下载了!用GEE免费批量处理Sentinel-2 L1C数据的保姆级教程(附完整代码)
  • 2026年比较好的江苏热管式煤气换热器/热管换热器/热管/煤气热管加热器值得信赖厂家推荐(精选) - 品牌宣传支持者
  • 告别混乱!用`etoolbox`宏包在LaTeX参考文献里精准标记多篇文献颜色(IEEE/ACM模板通用)
  • C++ 智能指针的生命周期分析