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

Qt 事件

Qt 事件

事件介绍

事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件是在用户操作时发出,如键盘事件、鼠标事件等,另一些事件则是由系统本身自动发出,如定时器事件。常 间的 Qt 事件如下:

在这里插入图片描述

常见事件描述

事件名称描述
鼠标事件鼠标左键、鼠标右键、鼠标滚轮,鼠标的移动,鼠标按键的按下和松开
键盘事件按键类型、按键按下、按键松开
定时器事件定时时间到达
进入离开事件鼠标的进入和离开
滚轮事件鼠标滚轮滚动
绘屏事件重绘屏幕的某些部分
显示隐藏事件窗口的显示和隐藏
移动事件窗口位置的变化
窗口事件是否为当前窗口
大小改变事件窗口大小改变
焦点事件键盘焦点移动
拖拽事件用鼠标进行拖拽

事件的处理

事件处理一般常用的方法为:重写相关的 Event 函数

Qt 中,几乎所有的 Event 函数都是虚函数,所以可以重新实现。如:在实现鼠标的进入和离开事件时,直接重新实现 enterEvent() 和 leaveEvent() 即可。enterEvent() 和 leaveEvent() 函数原型如下:

在这里插入图片描述

在这里插入图片描述

示例1:处理鼠标进入事件

1、新建 Qt 项目,基类选择 QWidget,同时勾选 UI 界面文件,如下图示;

在这里插入图片描述

2、设计 UI 文件,如下图示;

在这里插入图片描述

3、在项目中新添加⼀个类:MyLabel; 先选中项目名称QEvent,点击鼠标右键,选择addnew…,弹出如下对话框:

在这里插入图片描述

4、选择:Choose…,弹出如下界面;

在这里插入图片描述

5、此时项目中会新添加以下两个文件;

在这里插入图片描述

6、在帮助文档中查找对应的内容;

在这里插入图片描述

7、点击"显示"之后,出现如下内容:

在这里插入图片描述

8、复制 enterEvent(),粘贴在项目文件 mylabel.h 中;

在这里插入图片描述

9、重写 enterEvent() 方法;

在这里插入图片描述

10、在 UI 文件中选中 Label,右键------>提升为…

在这里插入图片描述

11、当点击"提升为…"之后,弹出如下对话框:

在这里插入图片描述

12、修改基类

在这里插入图片描述

在这里插入图片描述

13、执行效果如下:当鼠标进入设计好的标签之后,就会在应用程序输出栏中打印:鼠标进⼊

在这里插入图片描述

注意:Qt 6版本的函数声明和Qt 5版本不一样。需要进行更改

Qt 5:void enterEvent(QEvent *event);

Qt6:void enterEvent(QEnterEvent *event);

//Qt6:
class MyLabel : public QLabel
{Q_OBJECT
public:explicit MyLabel(QWidget *parent = nullptr);public://Qt5://void enterEvent(QEvent *event); //Qt6void enterEvent(QEnterEvent *event); signals:};

示例2:当鼠标点击时,获取对应的坐标值;

1、在上述示例1的基础上,在 mylabel.h 中声明 mousePressEvent() 方法

在这里插入图片描述

2、在 mylabel.cpp 中重写 mousePressEvent() 方法;

在这里插入图片描述

实现效果如下

在这里插入图片描述

示例:鼠标左键点击时,打印对应的坐标值,鼠标右键点击时,打印基于屏幕的坐标

在这里插入图片描述

按键事件

Qt 中的按键事件是通过 QKeyEvent 类来实现的。当键盘上的按键被按下或者被释放时,键盘事件便会触发。在帮助稳定中查找 QKeyEvent 类如下:

在这里插入图片描述

查找按键事件中所有的按键类型:在帮助稳定中输入:Qt::Key,如下图:

在这里插入图片描述

单个按键

示例:当某个按键被按下时,输出:某个按键被按下了;

1、新建项目,在头文件“widget.h”中声明虚函数 keyPressEvent();如下图

在这里插入图片描述

2、在“widget.cpp”文件中重写 keyPressEvent() 虚函数;

在这里插入图片描述

效果如下:

在这里插入图片描述

组合按键

在 Qt 助手中搜索:Qt::KeyboardModifier,如下图:

在这里插入图片描述

Qt::KeyboardModifier 中定义了在处理键盘事件时对应的修改键。在 Qt 中,键盘事件可以与修改键一起使用,以实现⼀些复杂的交互操作。KeyboardModifier 中修改键的具体描述如下:

Qt::NoModifier无修改键
Qt::ShiftModifierShift 键
Qt::ControlModifierCtrl 键
Qt::AltModifierAlt 键
Qt::MetaModifierMeta键(在Windows上指Windows键,在macOS上指Command键)
Qt::KeypadModifier使用键盘上的数字键盘进入输入时,Num Lock键处于打开状态
Qt::GroupSwitchModifier用于在输入法组之间切换

示例

在这里插入图片描述

效果如下

在这里插入图片描述

鼠标事件

在 Qt 中,鼠标事件是用 QMouseEvent 类来实现的。当在窗口中按下鼠标或者移动鼠标时,都会产生
鼠标事件。

利用 QMouseEvent 类可以获取鼠标的哪个键被按下了以及鼠标的当前位置等信息。在Qt 帮助文档中
查找 QMouseEvent 类如下图示

在这里插入图片描述

鼠标单击事件

在 Qt 中,鼠标按下是通过虚函数 mousePressEvent() 来捕获的。mousePressEvent() 函数原型如 下:

[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)

鼠标左右键及滚的表示如下:

Qt::LeftButton 鼠标左键

Qt::RightButton 鼠标右键

Qt::MidButton 鼠标滚轮

示例1:鼠标左键

1、在“widget.h”头文件中声明鼠标按下事件;

在这里插入图片描述

2、在“widget.cpp”文件中重新实现 mousePressEvent() 函数;

在这里插入图片描述

效果如下:

在这里插入图片描述

示例2:鼠标右键

在这里插入图片描述

在这里插入图片描述

示例3:鼠标滚轮

在这里插入图片描述

在这里插入图片描述

鼠标释放事件

鼠标释放事件是通过虚函数 mouseReleaseEvent() 来捕获的。mouseReleaseEvent() 函数原型如 下:

[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)

示例:

在这里插入图片描述

效果如下

在这里插入图片描述

鼠标双击事件

鼠标双击事件是通过虚函数:mouseDoubleClickEvent() 来实现的。mouseDoubleClickEvent() 函数原型如下:

[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)

示例:鼠标左键双击

在这里插入图片描述

效果如下:

在这里插入图片描述

鼠标移动事件

鼠标移动事件是通过虚函数:mouseMoveEvent() 来实现的。同时为了实时捕获鼠标位置信息,需要通过函数 setMouseTracking() 来追踪鼠标的位置。mouseMoveEvent() 函数原型如下:

[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)

setMouseTracking()函数原型如下:

void setMouseTracking(bool enable)

说明:

setMouseTracking() 函数默认是 false,需要设置为 true,才能实时捕获鼠标位置信息。否则只有当鼠标按下时才能捕获其位置信息。

示例

在这里插入图片描述

执行效果:

在这里插入图片描述

鼠标滚轮事件

在 Qt 中,鼠标滚轮事件是通过 QWheelEvent 类来实现的。滚轮滑动的距离可以通过 delta() 函数获取。delta() 函数原型如下:

int QGraphicsSceneWheelEvent::delta() const

其中返回值代表滚轮滑动的距离。正数表示滚轮相对于用户向前滑动,负数表示滚轮相对于用户向后滑动。

示例

在这里插入图片描述

执行效果

在这里插入图片描述

定时器

Qt 中在进行窗口程序的处理过程中,经常要周期性的执行某些操作,或者制作一些动画效果,使用定时器就可以实现。所谓定时器就是在间隔一定时间后,去执行某一个任务。定时器在很多场景下都会使用到,如弹窗自动关闭之类的功能等。

Qt中的定时器分为 QTimerEventQTimer 这2个类。

  • QTimerEvent 类用来描述一个定时器事件。在使用时需要通过 startTimer() 函数来开启一个定时器,这个函数需要输入一个以毫秒为单位的整数作为参数来表明设定的时间,它返回的整型值代表这个定时器。当定时器溢出时 (即定时时间到达)就可以在 timerEvent() 函数中获取该定时器的编号来进行相关操作。
  • QTimer 类来实现⼀个定时器,它提供了更高层次的编程接口,如:可以使用信号和槽,还可以设置只运行⼀次的定时器。

QTimerEvent 类

示例1: 在UI界面上放置两个 Label 控件,一个让其 1 秒数字累加一次,一个让其 2 秒数字累加一次。

1、新建项目,在 UI 界面文件放置两个 Label 控件

在这里插入图片描述

2、在 widget.h 头文件中声明 timerEvent() 函数,并定义两个整型变量;

在这里插入图片描述

3、在 widget.cpp 文件中重写 timerEvent() 函数;

在这里插入图片描述

效果如下

在这里插入图片描述

QTimer类

示例:在 UI 界面放置⼀个 Label 标签,两个按钮,分别是"开始"和"停止",当点击"开始"按钮时,开始每隔1秒计数一次,点击"停止"按钮时,暂停计数。

1、设计UI界面如下:

在这里插入图片描述

2、在 widget.cpp 文件中实现对应功能;

在这里插入图片描述

效果如下

在这里插入图片描述

获取系统日期及时间

在 Qt 中,获取系统的日期及实时时间可以通过 QTimer 类和 QDateTime 类。

QDateTime 类提供了字符串格式的时间。字符串形式的时间输出格式由 toString() 方法中的 format 参数列表决定,可用的参数列表如下:

在这里插入图片描述

示例:获取系统日期及实时时间;

1、设计UI界面文件;放置一个 Label 控件,用来显示日期及时间,放置两个按钮:“开始”和“停止”;

在这里插入图片描述

2、在“widget.h”头文件中声明更新时间的槽函数;

在这里插入图片描述

3、在"widget.cpp”文件中实现对应功能;

在这里插入图片描述

实现效果

在这里插入图片描述

事件分发器

概述

在 Qt 中,事件分发器(Event Dispatcher)是一个核心概念,用于处理 GUI 应用程序中的事件。事件分发器负责将事件从一个对象传递到另一个对象,直到事件被处理或被取消。*每个继承自 QObiect 类或 QObject 类本身都可以在本类中重写 boolevent(QEvent e) 函数,来实现相关事件的捕获和拦截。

事件分发器的工作原理

在Qt 中,我们发送的事件都是传给了 QObject 对象,更具体点是传给了 QObject 对象的 event() 函数。所有的事件都会进入到这个函数里面,那么我们处理事件就要重写这个 event() 函数。event() 函数本身不会去处理事件,而是根据事件类型 (type值)调用不同的事件处理函数。事件分发器就是工作在应用程序向下分发事件的过程中,如下图:

在这里插入图片描述

如上图,事件分发器用于分发事件。在此过程中,事件分发器也可以做拦截操作。事件分发器主要是通过 *bool event(QEvent e) 函数来实现。其返回值为布尔类型,若为 ture,代表拦截,不向下分发。

Qt 中的事件是封装在 QEvent 类中

在这里插入图片描述
示例

1、在“widget.h”头文件中声明鼠标点击事件和事件分发器;如下图示

在这里插入图片描述

2、在 widget.cpp 文件中实现鼠标点击事件和拦截事件;

在这里插入图片描述

效果如下

在这里插入图片描述

事件过滤器

在 Qt 中,一个对象可能经常要查看或拦截另外一个对象的事件,如对话框想要拦截按键事件,不让别
的组件接收到,或者修改按键的默认值等。我们已经知道,Qt 创建了 QEvent事件对象之后,会调用 QObject 的 event() 函数处理事件的分发。显然,我们可以在 event() 函数中实现拦截的操作。由于 event() 函数是 protected 的,因此,需要继承已有类。如果组件很多,就需要重写很多个 event() 函数。这当然相当麻烦,更不用说重写 event() 函数还得小心一堆问题。好在 Qt 提供了另外一种机制来达到这一目的:事件过滤器。

事件过滤器是在应用程序分发到 event 事件分发器之前,再做一次更高级的拦截。如下图示:

在这里插入图片描述

事件过滤器的一般使用步骤

1、安装事件过滤器;

2、重写事件过滤器函数:eventfilter() 。

示例:

1、新建 Qt 项目,基类选择 QWidget,同时勾选 UI 界面文件,如下图示;

在这里插入图片描述

2、设计 UI 文件,如下图示;

在这里插入图片描述

3、在项目新添加⼀个类:MyLabel; 先选中项目名称 QEvent,点击鼠标右键,选择 add new … ,弹出如下对话框

在这里插入图片描述

4、选择:Choose … ,弹出如下界面:

在这里插入图片描述

5、此时项目中会新添加以下两个文件:

在这里插入图片描述

6、在 UI 文件中选中 Label,右键 ------> 提升为…

在这里插入图片描述

7、当点击 "提升为… " 之后,弹出如下对话框

在这里插入图片描述

8、在 mylabel.h 中声明鼠标点击事件和事件分发器;

在这里插入图片描述

9、在 mylabel.cpp 文件中实现鼠标点击事件和事件分发器

在这里插入图片描述

10、在 widget.h 头文件中声明事件过滤器函数;

在这里插入图片描述

11、在 widget.cpp 文件中实现事件过滤器的两个步骤

在这里插入图片描述

在这里插入图片描述

效果如下

在这里插入图片描述

相关文章:

  • jenkins配置源码管理的git地址时,怎么使用不了 credential凭证信息
  • 大学生实习被企业坑了,教训比较深刻
  • sonarqube使用指北(二)-如何启动一次完整的本地扫描
  • jmeter接口导入方式
  • 鸿蒙 ohpm 的异常报错
  • STM32 ESP8266模块的曲折探索
  • 聚类分析|基于层次的聚类方法及其Python实现
  • Vue.js:构建高效且灵活的Web应用的利器
  • 黑客(网络安全)技术30天速成
  • 二进制源码部署mysql8.0.35
  • c++初阶------c++代码模块
  • c语言文件操作(下)
  • WEB测试之兼容性测试
  • cinder学习小结
  • JS——9大陷阱
  • 深入了解以太坊
  • 【Leetcode】101. 对称二叉树
  • 【技术性】Search知识
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Django 博客开发教程 8 - 博客文章详情页
  • gf框架之分页模块(五) - 自定义分页
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Laravel 实践之路: 数据库迁移与数据填充
  • learning koa2.x
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • node入门
  • PHP的Ev教程三(Periodic watcher)
  • Python_网络编程
  • ReactNativeweexDeviceOne对比
  • Vim Clutch | 面向脚踏板编程……
  • yii2中session跨域名的问题
  • 聊聊directory traversal attack
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前言-如何学习区块链
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​secrets --- 生成管理密码的安全随机数​
  • ​人工智能书单(数学基础篇)
  • # .NET Framework中使用命名管道进行进程间通信
  • #pragma 指令
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (11)MSP430F5529 定时器B
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (备忘)Java Map 遍历
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (十)c52学习之旅-定时器实验
  • (算法)前K大的和
  • (五)Python 垃圾回收机制
  • (循环依赖问题)学习spring的第九天
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选