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

Qt事件处理

1. 事件

众所周知Qt是一个基于C++的框架,主要用来开发带窗口的应用程序(不带窗口的也行,但不是主流)。我们使用的基于窗口的应用程序都是基于事件,其目的主要是用来实现回调(因为只有这样程序的效率才是最高的)。所以在Qt框架内部为我们提供了一些列的事件处理机制,当窗口事件产生之后,事件会经过:事件派发 -> 事件过滤->事件分发->事件处理几个阶段。Qt窗口中对于产生的一系列事件都有默认的处理动作,如果我们有特殊需求就需要在合适的阶段重写事件的处理动作。

事件(event)是由系统或者 Qt 本身在不同的场景下发出的。当用户按下/移动鼠标、敲下键盘,或者是窗口关闭/大小发生变化/隐藏或显示都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如鼠标/键盘事件等;另一些事件则是由系统自动发出,如计时器事件。

每一个Qt应用程序都对应一个唯一的 QApplication应用程序对象,然后调用这个对象的exec()函数,这样Qt框架内部的事件检测就开始了(程序将进入事件循环来监听应用程序的事件)。

每一个Qt应用程序都对应一个唯一的 QApplication应用程序对象,然后调用这个对象的exec()函数,这样Qt框架内部的事件检测就开始了(程序将进入事件循环来监听应用程序的事件)。

int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow* w = new MainWindow;w.show();return a.exec();
}



1.1 事件在Qt中产生之后的分发过程是这样的:

1.当事件产生之后,Qt使用用应用程序对象调用notify()函数将事件发送到指定的窗口:

[override virtual] bool QApplication::notify(QObject *receiver, QEvent *e);

2.事件在发送过程中可以通过事件过滤器进行过滤,默认不对任何产生的事件进行过滤。

// 需要先给窗口安装过滤器, 该事件才会触发
[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)

3.当事件发送到指定窗口之后,窗口的事件分发器会对收到的事件进行分类:

[override virtual protected] bool QWidget::event(QEvent *event);

4.事件分发器会将分类之后的事件(鼠标事件、键盘事件、绘图事件。。。)分发给对应的事件处理器函数进行处理,每个事件处理器函数都有默认的处理动作(我们也可以重写这些事件处理器函数),比如:鼠标事件:

// 鼠标按下
[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event);
// 鼠标释放
[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event);
// 鼠标移动
[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event);



2. 事件处理器函数

QWidget为例
在这里插入图片描述


测试案例

在这里插入图片描述

http://www.lryc.cn/news/177503.html

相关文章:

  • 宝塔nginx搭建Ftp文件服务器
  • SAP和APS系统订单BOM核对(SAP配置BOM攻略九)
  • ExcelServer EXCEL服务器使用- 用户、角色权限配置
  • JOSEF约瑟 静态中间继电器JZY-402 JZJ-404 AC220V 触点形式两开两闭
  • C#并发编程的实现方式
  • qemu源码下载和安装
  • 计算机,软件工程,网络工程,大数据专业毕业设计选题有哪些(附源码获取)
  • CyclicBarrier 、CountDownLatch 、Semaphore 的用法
  • RestTemplate发送HTTPS请求
  • 图像练习-矩形4点OpenCV(01)
  • 不同层设置不同学习率
  • 剑指offer32Ⅰ:从上到下打印二叉树
  • 【VUE复习·8】v-if;v-show高级
  • 线程同步需要注意什么?
  • 力扣算法题:35、搜索插入位置.java版
  • 七、热力图展示
  • 基于微信小程序的新闻发布平台小程序设计与实现(源码+lw+部署文档+讲解等)
  • 【论文阅读】Directional Connectivity-based Segmentation of Medical Images
  • 借“牛油果”爆款出圈,甜啦啦的底牌只是“价格”?
  • 【C语言】快速排序
  • Java列表查询Long(id)到前端转换出错
  • react import爆红
  • ThreeJS-3D教学三:平移缩放+物体沿轨迹运动
  • 玩玩“小藤”开发者套件 Atlas 200I DK A2 之VSCode远程连接
  • 安装python中tensorflow和keras==2.2.0的路程
  • Linux命令历史记录管理:使用history命令提高工作效率
  • Armv9 Cortex-A720的L1 memory system 和 L1 Cache
  • 使用超声波清洗机洗眼镜有哪些注意事项、高颜值超声波清洗机推荐
  • 23种设计模式汇总详解
  • stream流的filter和map过滤