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

Qt 事件

文章目录

    • 1.基本介绍
      • 1.QT 中事件的定义
      • 2.事件的传递

1.基本介绍

1.QT 中事件的定义

在 Qt 里,事件是对程序运行时所发生的各类状况的抽象表示。

在 Qt 中常见的事件类型如下:
1.用户输入事件:
1.鼠标事件:QMouseEvent 涵盖鼠标按下、释放、移动、双击等操作;QWheelEvent 处理鼠标滚轮滚动。
2.键盘事件:QKeyEvent 处理键盘按键的按下和释放。
2.窗口和控件事件:
1.窗口事件:QResizeEvent 在窗口大小改变时触发;QMoveEvent 窗口位置移动时产生;QCloseEvent 尝试关闭窗口时触发。
2.焦点事件:QFocusEvent 处理控件获得或失去焦点。
3.QShowEvent 和 QHideEvent 分别在窗口或控件显示和隐藏时触发;
4.绘制事件:QPaintEvent 在窗口或控件需重绘时触发,可进行自定义绘制。
5.定时器事件:QTimerEvent 由定时器触发,用于定时任务。

2.事件的传递

进入事件队列
事件产生后进入 Qt 应用的事件队列,主循环会依次从队列取事件处理。
传递规则
1.目标对象:事件先到与发生位置最相关的对象,如鼠标点击位置所在控件。
2.对象处理:目标对象用事件处理函数尝试处理,若处理(返回true)则传递结束;未处理(返回false)则传给父对象。
3.父对象及顶级窗口:父对象重复处理流程,若到顶级窗口仍未处理,事件通常被忽略。
特殊机制
事件过滤器:可让一个对象拦截处理其他对象的事件,事件先经其处理,处理了则不再传目标对象。
自定义事件:开发者创建发送,传递规则与系统事件相同,用QCoreApplication::postEvent()或QCoreApplication::sendEvent()发送。

事件立即发送
QCoreApplication::sendEvent() 能立即发送事件,事件不进队列,直接由目标对象处理。这是同步操作,调用后函数等待事件处理完成才返回。

Qt 中阻止事件向父类传递方法:

1.重写事件处理函数:返回 true 表示事件已处理,如:
1.调用 event->accept():标记事件已接受,可结合返回 true,如:
1.使用事件过滤器:安装过滤器并在 eventFilter 中返回 true 拦截,如:

核心函数
这个为虚函数
bool QApplication::notify(QObject *receiver, QEvent *e)
在这里插入图片描述

事件过程:
1、QApplication::exec 开启事件循环
2、QEventLoop::processEvents 从事件循环中取出事件并发送
3、 QCoreApplication::sendPostedEvents 发送事件
4、bool QApplication::notify(QObject *receiver, QEvent *e) 处理事件
(1)判断返回值, notify_helper && isAccepted() 时不再遍历父widget
5、notify_helper 函数执行逻辑
(1)先执行qApp安装的事件过滤器,即qApp->installEventFilter安装的。
(2)然后执行自己安装的事件过滤器,即this->installEventFilter安装的,
(3)Event。
6、QWidget::event 主要分发到各个处理函数,如mousePressEvent等。

http://www.xdnf.cn/news/14799.html

相关文章:

  • Python从入门到精通——第一章 Python简介
  • 从 TCP/IP 协议栈角度深入分析网络文件系统 (NFS)
  • join性能问题,distinct和group by性能,备库自增主键问题
  • 孪生素数猜想 - 张益唐的核心贡献和陶哲轩的改进
  • vue-37(模拟依赖项进行隔离测试)
  • 互联网大厂Java面试实录:Spring Boot与微服务在电商场景中的应用
  • 经典灰狼算法+编码器+双向长短期记忆神经网络,GWO-Transformer-BiLSTM多变量回归预测,作者:机器学习之心!
  • List中的对象进行排序处理
  • Go基础(Gin)
  • Python 机器学习核心入门与实战进阶 Day 1 - 分类 vs 回归
  • 扣子空间PPT生产力升级:AI智能生成与多模态创作新时代
  • 【Linux仓库】进程优先级及进程调度【进程·肆】
  • Linux之Socket编程Tcp
  • Spring Cloud(微服务部署与监控)
  • Superman
  • Rust Web 全栈开发(一):构建 TCP Server
  • 新版本没有docker-desktop-data分发 | docker desktop 镜像迁移
  • MYSQL基础内容
  • Django 安装使用教程
  • OpenHarmony 5.0监听导航栏和状态栏是否显示
  • OpenCV CUDA模块设备层-----高效地计算两个uint 类型值的平均值函数vavg2()
  • android核心技术摘要
  • gin框架 中间件 是在判断路由存在前执行还是存在后执行的研究
  • 机器学习:集成学习方法之随机森林(Random Forest)
  • 【Unity】MiniGame编辑器小游戏(九)打砖块【Breakout】
  • 【前端】基础 - HTML基础标签和样式设置
  • 【新手小白的嵌入式学习之路】-STM32的学习_GPIO 8种模式学习心得
  • 第二章AIGC入门:打开人工智能生成内容的新世界大门(3/36)
  • Windows连接L2TP/IPsec 协议 VPN失败
  • QT异步操作