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

QT中的事件及其属性

Qt中的事件是对操作系统提供的事件机制进行封装,Qt中的信号槽就是对事件机制的进一步封装

但是特殊情况下,如对于没有提供信号的用户操作,就需要通过重写事件处理的形式,来手动处理事件的响应逻辑

常见的Qt事件:

常见事件描述

事件名称

描述

鼠标事件

鼠标左键、鼠标右键、鼠标滚轮,鼠标的移动,鼠标按键的按下和松开

键盘事件

按键类型、按键按下、按键松开

定时器事件

定时时间到达

进入离开事件

鼠标的进入和离开

滚轮事件

鼠标滚轮滚动

绘屏事件

重绘屏幕的某些部分

显示隐藏事件

窗口的显示和隐藏

移动事件

窗口位置的变化

窗口事件

是否为当前窗口

大小改变事件

窗口大小改变

焦点事件

键盘焦点移动

使用QEvent来表示事件的概念,使用其子类表示具体操作产生的事件

自定义事件处理的方式:

让当前的类,重写具体事件的处理函数----用的是C++的多态机制

创建的子类继承自Qt已有的类,在子类中重写父类的事件处理函数,后续触发事件时,通过多态机制,执行子类重写的处理函数

例:

重写鼠标进入enterEvent和鼠标离开leaveEvent的事件

在ui界面创建一个pushbutton,当鼠标离开,进入时进行debug输出

通过创建一个QPushButton的子类---新建文件为c++类,在子类中重写两个事件的处理函数

在pushbutton.h引入头文件,修改构造函数的声明,使其在构造时能指定父类

在pushbutton.cpp实现构造函数指定父类

在pushbutton.h声明要重写的事件处理函数,要想重写父类的函数,需要保证函数名和函数的参数列表与父类的完全一致

在pushbutton.cpp文件实现处理函数重写

但是此时无法触发重写函数,因为在ui界面创建的按钮是QPushButton,而不是重写的pushbutton

通过在ui界面右键点击pushbutton,点击提升为

成功提升后,对象树中控件的名字就会发生改变

此时,鼠标离开和进入事件的处理函数就成功被自定义

鼠标按下事件

mousePressEvent()

通过事件获取并打印鼠标的位置

在ui界面创建一个label,并将farmeshape设置为box

在新建一个c++class文件,继承自QLabel

修改头文件和cpp文件中的构造函数,使接收父类指针

在再ui界面,将QLabel提升为label

在label.h头文件声明重写事件处理函数mousePressEvent

在label.cpp文件进行重写,实现触发label的鼠标点击事件后,输出鼠标位置

还需将头文件导图mainwindow.cpp中

此时就可以通过自定义的事件处理函数来实现点击label输出鼠标位置

不仅左键能触发,右键或其它标准鼠标按键都能触发mousePressEvent事件

可以设置为仅将左键触发的事件进行输出

鼠标释放事件

鼠标释放事件是mouseReleseEvent()

在上面的label继续进行虚函数重写

头文件进行虚函数声明

源文件进行重写

鼠标双击事件

mouseDoubleClickEvent()

同样在label进行虚函数声明与重写

鼠标移动事件

mouseMoveEvent()

直接在新建的MainWindow文件的mainwindow类进行重写,是鼠标在整个窗口的动作都能被获取到

声明

重写

运行后,开始时无输出

因为鼠标移动事件,随便移动一下鼠标就会产生大量的鼠标移动的事件,当进行事件捕获时,会有大量鼠标移动事件需要处理,容易造成程序卡顿

Qt为了保证程序的流畅性,默认情况下不会对鼠标移动进行追踪,鼠标移动时不会调用mouseMoveEvent,除非显示告诉Qt需要追踪鼠标位置

方法:

在构造函数调用setMouseTracking(),将是否追踪鼠标位置设为true,才能追踪鼠标的移动位置

鼠标滚轮的滚动事件

wheelEvent()

例:

新建文件继承自QWidget

进行虚函数声明与重写

按键事件

Qt中的按键事件是通过QKeyEvent类来实现的,当键盘上的按键被按下或者被释放时,键盘事件便会触发

Qt中封装了按键事件----QShortCut类

通过QShortCut定义一个快捷键,指定按键后,按下对应按键发出对应信号,通过定义信号的槽函数来实现对应操作

通过事件直接获取用户按下键盘的操作

keyPressEvent(QKeyEvent* )

QKeyEvent

例:

创建一个继承自QWidget的文件

进行虚函数的声明和重定义

按下a,b,c后打印65,66,67,因为Qt中将键盘的所有按键进行枚举

通过对key值进行判断可以获取指定按键是否被按下,如获取a键

对于组合键,如:ctl+a如何进行获取?

同样可以通过key值利用modifiers---同时按下了什么键,来进行获取

定时器事件

Qt中在进行窗口程序的处理过程中,经常要周期性的执行某些操作,可以通过定时器进行实现。

定时器就是在时间间隔一定时间后,去执行某一共任务。

Qt中的定时器分为QTimerEvent和QTimer俩个类

QTimerEvent

QTimerEvent类用来描述一个定时器事件。在使用时需要通过startTimer()函数来开启一个定时器,这个函数需要输入一个以毫秒为单位的整数作为参数来表明设定的时间,它返回的整形值代表这个定时器。当定时时间到达时,就可以在timerEvent()函数中获取该定时器的编号来进行相关操作。

例:

创建一个继承自QWidget的文件

实现简单的倒计时功能

在ui界面创建一个LcdNumber

将其初始值设为10

在头文件声明一个int timerid用来接收定时器编号

在构造函数开启定时器事件,接收timerid

对timerEvent进行虚函数的声明与重写

QTimer类来实现一个定时器---由QTimerEvent封装而来,提供更高层次的编程接口,如:可以使用信号和槽,还可以设定只运行一次的定时器

窗口事件

moveEvent()窗口移动时触发的事件

resizeEvent()窗口大小改变时触发的事件

例:

创建一个继承自QWidget的文件

对两个虚函数进行声明与重写

相关文章:

  • 如何理解promise 续一
  • 2025 网络安全技术深水区探索:从 “攻防对抗” 到 “数字韧性” 的范式跃迁
  • ts全局导入接口
  • 深入浅出提示词工程(结合 DeepSeek)
  • C++翻转数相乘 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析
  • 从数据孤岛到智能决策:健康管理系统如何打通企业健康大数据?
  • Shell脚本-while循环应用案例
  • Redux-Saga vs Redux-Thunk
  • 【C++QT】Layout 布局管理控件详解
  • 3G大一下安卓考核题解
  • 【Linux 线程与进程】线程与进程技术基础
  • MySQL 存储引擎与服务体系深度解析
  • Python爬虫(7)Python数据存储实战:CSV文件读写与复杂数据处理指南
  • 写读后感的时候,可以适当地引用书中的内容吗?
  • dma_buf学习记录之二核心接口
  • 基于STM32、HAL库的ADS1255IDBR模数转换器ADC驱动程序设计
  • AI赋能智慧医疗新范式:小天互连即时通讯打造高效、安全的医疗通讯平台
  • makefile总结
  • 【C语言干货】回调函数
  • 优先队列、堆笔记(算法第四版)
  • 玉渊谭天丨中方减少美国农产品进口后,舟山港陆续出现巴西大豆船
  • 阿曼外交大臣:伊美下一轮谈判暂定5月3日举行
  • 三大交易所修订股票上市规则:明确关键少数责任,强化中小股东保障
  • 比亚迪一季度日赚亿元,净利润同比翻倍至91.55亿元
  • 四川省人大常委会原党组成员、副主任宋朝华接受审查调查
  • 迎接神十九乘组回家,东风着陆场各项工作已准备就绪