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的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪

相关推荐
用户8055336980314 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner15 小时前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz6 天前
QML Hello World 入门示例
qt
xcyxiner9 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner9 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner10 天前
DicomViewer (添加模型类)3
qt
xcyxiner10 天前
DicomViewer (目录调整) 2
qt
xcyxiner10 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00612 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术12 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript