Qt的事件

Qt的事件

🌟🌟hello,各位读者大大们你们好呀🌟🌟

🚀🚀系列专栏:【Qt的学习】

📝📝本篇内容:Qt事件的基本概念;enterEvent和leaveEvent;QMouseEvent;mouseMoveEvent;QWheelEvent;QKeyEvent;QTimerEvent;QMoveEvent和QRizeEvent

⬆⬆⬆⬆上一篇:Qt的窗口(三)

💖💖作者简介:轩情吖,请多多指教(>> •̀֊•́ ) ̖́-

1.Qt事件的基本概念

虽然我们的Qt是跨平台的C++开发框架,Qt的很多能力其实是操作系统提供的,只不过Qt封装了系统的API。程序是运行在操作系统上的,需要系统给我们提供支撑。

我们之前讲的信号槽,用户进行各种各样的操作,就可能会产生信号,可以给某个信号指定槽函数,当信号触发时,就能够自动的执行到对应的槽函数。现在讲的事件也非常的类似,用户进行的各种操作,也会产生事件,程序员同样可以给事件关联上处理函数,当事件触发时,就能够执行对应的代码

事件本身是操作系统提供的机制。Qt同样把操作系统事件机制进行了封装,在Qt中进行使用,但是由于事件对应的代码编写起来不是很方便,因此Qt对于事件机制又进行了进一步的封装,变成了信号槽。
信号槽就是对于事件的进一步封装,事件就是信号槽的底层机制

在我们开发的过程中,绝大部分和用户之间的交互都是通过"信号槽"完成的。有些特殊情况下,信号槽不一定能搞定(比如某个用户的动作行为,Qt没有提供对应的信号),此时就需要通过重写事件处理函数的形式,来手动处理事件的响应逻辑。

QEvent可以理解为是事件的一个概念,而下面的子类分别都是代表了各种具体的事件,不同的场景下要关注的点是不一样的,每一个子类中就会包含一些对应的不同的属性。

当我们想要将一段代码和某个事件关联起来时就需要让当前的类重写某个事件的处理函数,当事件触发时,就能指定到这段代码。这里用到了多态的机制,创建子类,继承自Qt已有的类,在子类中重写父类的事件处理函数,当后续事件触发过程中,就会通过多态机制,执行到咱们自己写的子类的函数中

2.enterEvent和leaveEvent


这两个函数是QWidget的,但是我们也可以使用QLabel来使用,因为QLabel继承了QWidget。这两个函数分别是用来处理鼠标的进入和离开,通过之前我们讲的,我们需要QLabel的这两个函数,因此需要创建一个类并继承QLabel


代码虽然不难,但是有一个问题,如果这个时候去运行程序,不会有任何效果,这主要是因为当前界面上创建的label其实是QLabel,不是咱们自己写的Label,我们必须要确保界面上的这个label是一个咱们自己定义的Label类的实例才能执行到。我们可以通过在图形化界面上对着QLabel右键进行提升




也可以从Debug文件下的ui_widget.h文件中查看提升前后的区别

3.QMouseEvent

接下来要讲的是三个函数是主要围绕QMouseEvent的,通过事件获取到鼠标点击释放等相关信息

我先把简单的代码和ui设置好


现在挨个来写三个函数

在我们演示的效果中,除了左键和右键,还有中间的滚轮键、前进键。后退键,也是可以触发的,但是有的鼠标可能还有更多的按键就不一定了。在代码中我们打印了两个坐标,第一个指的是以label为原点,第二个global是以电脑的显示器为原点

这个就比较简单了,就是点击完后松开释放就会触发这个事件,像我们之前使用的clicked这样的信号就相等于是一次鼠标按下事件和一次鼠标释放事件

双击必须是第二次按下的时候,才能够识别到是"双击",但是第一次按下的时候会识别成单击,比如有的程序可能是单击有一些逻辑,双击有一些逻辑,这样就会触发单击的逻辑,就会有bug

4.mouseMoveEvent

这个函数是用来处理鼠标移动事件的,在我们之前重写鼠标事件的操作,都是在自定义的Label中完成的,此时鼠标只有在Label范围内进行活动的时候才能捕获到,但是我们也可以直接把这些操作直接放到Widget中来完成。这样的话,鼠标在整个窗口中进行的各种动作都能获取到了

鼠标的移动不同于鼠标按下,随便移动一下鼠标,就会产生大量的鼠标移动事件。当你进行捕获事件的时候,尤其是一些复杂逻辑的时候,程序负担就很重,容易产生卡顿,Qt为了保证程序的流畅性,默认情况下不会对简单的鼠标移动进行追踪,只有按鼠标按键进行追踪才会有效,除非显式的告诉Qt就要追踪鼠标位置,使用setMouseTracking函数来设置,就可以通过简追踪单移动鼠标。

5.QWheelEvent

这个函数用于处理鼠标滚轮事件,当用户在部件上滚动鼠标滚轮时,该函数会被调用


使用起来非常简单,通过event我们可以知道当前鼠标滚轮的方向以及次数,-120是滚轮向下滑动,120是滚轮向上滑动

6.QKeyEvent

接下来这个函数是围绕键盘的,我们可以通过这个函数知道我们键盘所点击的内容,像我们之前学的QShortCut,这是信号槽机制封装过的,获取键盘按键的方式。站在底层的角度,也可以通过事件获取当前用户键盘按下的情况


这个也就比较简单,主要是使用组合键的话,我们需要搭配modifiers(修饰符)来使用

7.QTimerEvent

像我们之前在定时器使用的QTimer的背后是QTimerEvent定时器事件进行支撑,我们QObject提供了一个timerEvent函数

除了这个,还要使用两个额外的函数startTimer启动定时器以及killTimer关闭定时器


最后的功能就是10-0的倒计时,其中我们设置了一个成员变量timerId,它是用来区分定时器的。如果一个程序中存在多个定时器 (startTimer 创建的定时器),此时每个定时器都会触发 timerEvent 函数,因此我们在函数中要进行判断是否是我们想要的定时器。

8.QMoveEvent和QRizeEvent


接下来要讲的两个函数也非常简单,分别是移动事件和大小调整事件,只要当设置的控件进行移动或者调整大小就会触发,直接看代码



🌸🌸Qt的事件大概就讲到这里啦,博主后续会继续更新更多Qt的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!如有小伙伴需要Qt的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪

相关推荐
Chester_19997 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲8 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员8 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导8 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan8 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
小灰灰搞电子9 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化9 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
m0_695251499 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
大衛說10 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
可乐鸡翅yeah_11 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线