Qt 系统相关 - 1

虽然 Qt 是跨平台的 C++ 开发框架,Qt 有很多能力其实是操作系统提供的,只不过 Qt 封装了系统的 API

程序时运行在操作系统上的,需要系统给我们提供支撑!

  1. 事件
  2. 文件操作
  3. 多线程编程
  4. 网络编程
  5. 多媒体(音频,视频)

Qt 事件

事件介绍

信号槽:用户进行的各种操作可能会产生出信号,我们可以给某个信号指定槽函数,当信号触发时,就能够自动的执行到对应的槽函数!

事件也是非常类似的,用户进行的各种操作,也会产生事件,程序员同样可以给事件关联上处理函数(处理的逻辑),当事件触发的时候,就能够执行到对应的代码!

事件本身是操作系统提供的机制,Qt  也同样把操作系统事件进行了封装,拿到了 Qt 中!但是由于事件对应的代码编写不是很方便,所以 Qt 对于事件这样的机制又进行了封装,就得到了信号槽!

所以事件就是信号槽的底层机制!实际 Qt 开发程序过程中,绝大部分和用户之间进行的交互是通过“信号槽”来完成的!但是对于有些特殊情况,信号槽不一定能搞定(某个用户的动作行为,Qt 没有提供对应的信号...这时候我们就需要通过重写事件的处理函数的形式,来手动处理事件的响应逻辑)

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

常见事件描述:

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

事件的处理

让一段代码和某一个事件关联起来,当事件触发的时候,就能指定到这段代码

之前信号槽是通过 connect 来完成上述关联的!对于事件来说,还不太一样:

事件处理一般常用的方法为:重写相关的 Event 函数。(用到了面向对象的多态的机制:创建子类,然后继承自 Qt 中已有的类,在子类中重写父类的事件处理函数,后续事件出发过程中,就会通过多态这样的机制,执行到咱们自己写的子类的函数中!)

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

[virtual protected] void QWidget::enterEvent(QEvent *event)

This event handler can be reimplemented in a subclass to receive widget enter events which are passed in the event parameter. An event is sent to the widget when the mouse cursor enters the widget.

See also leaveEvent(), mouseMoveEvent(), and event().

[virtual protected] void QWidget::leaveEvent(QEvent *event)

This event handler can be reimplemented in a subclass to receive widget leave events which are passed in the event parameter. A leave event is sent to the widget when the mouse cursor leaves the widget.

See also enterEvent(), mouseMoveEvent(), and event().

示例1:

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

2. 设计 ui 文件,如下所示:

3. 在项目中新添加一个类:MyLabel

创建 QLable 子类,重写 enterEvent 和 leaveEvent!

先选中项目名称 QEvent,点击鼠标右键,选择 add new ...,弹出如下对话框:

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

5. 此时项目会新增如下两个文件:

6. 在帮助文档中查找对应的内容:

7. 点击“显示”之后,出现如下内容:

[virtual protected] void QWidget::enterEvent(QEvent *event)

This event handler can be reimplemented in a subclass to receive widget enter events which are passed in the event parameter. An event is sent to the widget when the mouse cursor enters the widget.

See also leaveEvent(), mouseMoveEvent(), and event().

8. 复制 enterEvent() ,粘贴在项⽬⽂件 "mylabel.h" 中:

9. 重写 enterEvent() ⽅法:

10. 在 UI ⽂件中选中 Label,右键 ------> 提升为...

我们直接执行是不行的!

因为当前界面上创建的这个 label 其实是QLabel,不是我们自己写的 MyLabel!

必须要确保界面上的这个 label 是一个咱们自己定义的 Mylabel 的示例,才会执行到!

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

12. 修改基类:

13. 执⾏效果如下:当⿏标进⼊设计好的标签之后,就会在应⽤程序输出栏中打印:⿏标进⼊:

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

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

#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>class MyLabel : public QLabel
{Q_OBJECT
public:explicit MyLabel(QWidget *parent = nullptr);// 鼠标进入事件void enterEvent(QEvent *ev);// 鼠标移动事件void mousePressEvent(QMouseEvent *ev);signals:};#endif // MYLABEL_H

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

#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
}void MyLabel::enterEvent(QEvent *ev)
{qDebug() << "鼠标进入";
}void MyLabel::mousePressEvent(QMouseEvent *ev)
{// Qt中的格式化字符串QString str1 = QString("鼠标按下了 x = %1, y = %2").arg(ev->x()).arg(ev->y());qDebug() << str1;
}

实现效果如下:

鼠标进入
"鼠标按下了 x = 54, y = 61"
"鼠标按下了 x = 234, y = 15"
"鼠标按下了 x = 393, y = 51"
"鼠标按下了 x = 180, y = 140"
"鼠标按下了 x = 488, y = 146"

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

void MyLabel::mousePressEvent(QMouseEvent *ev)
{// 鼠标左键if(ev->button() == Qt::LeftButton){// x,y为基于窗口的坐标QString str = QString("鼠标左键:x = %1, y = %2").arg(ev->x()).arg(ev->y());qDebug() << str.toUtf8().data();}// 鼠标右键if(ev->button() == Qt::RightButton){// globalX,globalY为基于屏幕的坐标QString str = QString("鼠标右键:x = %1, y = %2").arg(ev->globalX()).arg(ev->globalY());qDebug() << str.toUtf8().data();}
}

按键事件

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

查找按键事件中所有的按键类型:在帮助⽂档中输⼊:Qt::Key,如下图:

单个按键事件处理

示例:当某个按键被按下时,输出提示信息:“某个按键被按下了”。

1. 新建项目:在项目的头文件 widget.h 中声明一个虚函数 keyPressEvent()

2. 在 "widget.cpp" ⽂件中重写 keyPressEvent() 虚函数;

组合按键

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

在Qt中,键盘事件可以通过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中可以与键盘事件一起使用,以实现一些复杂的交互操作。例如,在处理键盘事件时,可以通过检查这些修饰键的状态来判断用户是否同时按下了特定的组合键。

示例:

鼠标事件

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

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

示例:

执行效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921267.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“12306”有多牛逼?从架构师的角度详细的告诉你

12306铁路票务系统架构深度解析 &#x1f4da; 目录 系统概述业务特点与技术挑战整体架构设计核心技术架构高并发处理策略数据存储与管理缓存体系设计分布式系统架构安全防护体系性能优化策略监控与运维技术演进历程总结与展望 每到春节、国庆这种全民迁徙的时刻&#xff0c;…

数据采集机器人哪家好?2025 年实测推荐:千里聆 RPA 凭什么成企业首选?

在数字化转型加速的今天&#xff0c;数据采集已成为企业运营的核心环节&#xff0c;数据采集机器人正在重构企业的效率边界。2025 年中国 RPA 市场排名显示&#xff0c;泛微旗下的千里聆 RPA 已跻身行业前五&#xff0c;成为中大型国央企的首选品牌。本文将通过三维评估体系&am…

基础crud项目(前端部分+总结)

本人根据自己对前端微不足道的理解和 AI 老师的指导下&#xff0c;艰难地完成了基础crud代码的全栈开发&#xff0c;算是自己的第一个 Java 项目&#xff0c;对此做个简单总结。 后端部分 在前后端分离开发中&#xff0c;前端负责页面交互与数据展示&#xff0c;后端提供接口支…

MATLAB矩阵及其运算(二)函数

函数分为MATLAB内置函数及用户自定义函数&#xff0c;用户可以直接调用内置函数进行数据处理。内置函数的使用函数由三部分组成&#xff1a;名称、输入和输出。内置函数示例&#xff1a;单输入单输出函数&#xff1a;sqrt(x)&#xff1b;单输入多输出函数&#xff1a;size(x)&a…

自动化运维-ansible中对于大项目的管理

自动化运维-ansible中对于大项目的管理 一、引用主机清单 在Playbook中引用主机时&#xff0c;hosts 字段指定的目标必须与Ansible主机清单中定义的标识符完全匹配。如果清单中配置的是主机名&#xff0c;则在Playbook中使用IP地址或其他别名将无法匹配&#xff0c;导致任务被跳…

59_基于深度学习的麦穗计数统计系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)

目录 项目介绍&#x1f3af; 功能展示&#x1f31f; 一、环境安装&#x1f386; 环境配置说明&#x1f4d8; 安装指南说明&#x1f3a5; 环境安装教学视频 &#x1f31f; 二、数据集介绍&#x1f31f; 三、系统环境&#xff08;框架/依赖库&#xff09;说明&#x1f9f1; 系统环…

面试问题详解十六:Qt 内存管理机制

在 Qt 开发过程中&#xff0c;很多初学者&#xff08;包括不少有经验的 C 程序员&#xff09;经常会产生这样的疑问&#xff1a;“我在 Qt 中 new 出来的控件好像都没有 delete&#xff0c;那内存不会泄漏吗&#xff1f;”比如下面这段代码&#xff1a; void Widget::createLef…

Pycharm 试用

Ubuntu 重置Pycharm试用期限&#xff08;30 天&#xff09; 先关闭Pycharm删除系统缓存 rm -rf ~/.config/JetBrains/ && rm -rf ~/.local/share/JetBrains/ && rm -rf ~/.cache/JetBrains/删除已经安装的 Pycharm 软件运行目录去官网下载新的 就行了

C++ Qt 开发核心知识

Qt 框架概述Qt 是一个跨平台的 C 应用程序开发框架&#xff0c;广泛用于开发图形用户界面程序。其核心特性包括跨平台能力、丰富的功能模块和强大的工具集。核心概念与机制元对象系统Qt 扩展了标准 C&#xff0c;通过元对象系统提供信号与槽机制、运行时类型信息和动态属性系统…

net9 aspose.cell 自定义公式AbstractCalculationEngine,带超链接excel转html后背景色丢失

AbstractCalculationEngine 是 Aspose.Cells 中一个强大的抽象类&#xff0c;允许您自定义公式计算逻辑。当您需要覆盖默认计算行为或实现自定义函数时非常有用。直接上代码1. 创建自定义计算引擎using Aspose.Cells; using System;// 创建自定义计算引擎 public class CustomC…

如何监控员工的电脑?7款实用的员工电脑管理软件,探索高效管理捷径!

当销售团队在淘宝刷单、设计师用公司电脑挖矿、程序员频繁访问代码托管网站时&#xff0c;企业损失的不仅是带宽——低效、泄密、合规风险正成为隐形利润杀手。 传统管理依赖“人盯人”或抽查日志&#xff0c;但面对分布式办公与远程协作趋势&#xff0c;这些方法早已力不从心…

机器视觉软件--VisionPro、Visual Master,Halcon 和 OpenCV 的学习路线

Halcon 和 OpenCV区别 Halcon 和 OpenCV 都是计算机视觉领域的重要工具&#xff0c;但它们的设计理念、功能侧重和适用场景有显著不同。下面这个表格汇总了它们的核心区别&#xff0c;方便你快速了解&#xff1a; 开发模式与体验​​&#xff1a;Halcon 配备了强大的​​图形化…

算法-根据前序+中序遍历打印树的右视图

题目请根据二叉树的前序遍历&#xff0c;中序遍历恢复二叉树&#xff0c;并打印出二叉树的右视图数据范围&#xff1a; 0≤n≤100000≤n≤10000 要求&#xff1a; 空间复杂度 O(n)O(n)&#xff0c;时间复杂度 O(n)O(n)如输入[1,2,4,5,3],[4,2,5,1,3]时&#xff0c;通过前序遍历…

Kafka面试精讲 Day 7:消息序列化与压缩策略

【Kafka面试精讲 Day 7】消息序列化与压缩策略 在Kafka的高性能消息系统中&#xff0c;消息序列化与压缩是影响吞吐量、延迟和网络开销的核心环节。作为“Kafka面试精讲”系列的第7天&#xff0c;本文聚焦于这一关键主题&#xff0c;深入剖析其原理、实现方式、配置策略及常见…

Xterminal软件下载_Xterminal ssh远程链接工具下载__Xterminal安装包 网盘下载_Xterminal ssh远程链接工具安装包

Xterminal 作为一款国产 SSH 工具&#xff0c;专为开发人员量身打造。它支持 SSH 和 Telnet 协议连接远程服务器与虚拟机&#xff0c;无论是进行代码部署&#xff0c;还是服务器运维&#xff0c;都能轻松胜任。软件界面采用极简设计&#xff0c;黑色背景搭配白色文字&#xff0…

Lua > 洛谷

Lua > 洛谷P1000 超级玛丽游戏P1001 AB ProblemP1008 [NOIP 1998 普及组] 三连击P1035 [NOIP 2002 普及组] 级数求和P1046 [NOIP 2005 普及组] 陶陶摘苹果P1047 [NOIP 2005 普及组] 校门外的树P1085 [NOIP 2004 普及组] 不高兴的津津P1089 [NOIP 2004 提高组] 津津的储蓄计划…

小企业环境-火山方舟和扣子

背景说明 并不是说应该怎么办&#xff0c;而是基本配置有这些可以进行使用&#xff0c;具体不同企业使用的时候肯定要个性化配置。 使用了火山方舟和扣子 火山方舟 应用实验室列表 简单使用了提示词的功能&#xff0c;后端服务ARK_API_KEY 应用ID 来对应请求发送http请求…

QT-事件

Qt事件 除了信号和槽通信机制外&#xff0c;Qt中还提供了事件处理机制实现与用户的交互和对象间的通信。Qt捕获底层操作系统消息&#xff0c;进行封装之后转换为Qt事件&#xff0c;事件处理后才发出信号。 一、事件概述Qt中事件是程序内部或外部发生的动作。比如程序外部&#…

HI3519DRFCV500/HI3519DV500海思核心板IPC算力2.5T图像ISP超高清智能视觉应用提供SDK软件开发包

Hi3519DV500是一颗面向视觉行业推出的超高清智能 SoC。最高支持四路sensor输入&#xff0c;支持最高4K30fps的ISP图像处理能力&#xff0c;支持 2F WDR、多级降噪、六轴防抖、全景拼接、多光 谱融合等多种传统图像增强和处理算法&#xff0c;支持通过AI算法对输入图像进行实时降…

go 初始化组件最佳实践

Go 语言初始化最佳实践 在 Go 语言中, 有一个 init() 函数可以对程序进行包级别的初始化, 但 init() 函数有诸多不便, 例如: 无法返回错误, 进行耗时初始化时, 会增加程序启动时间。因此 init() 函数并不适用于所有初始化。 1.初始化方式 在程序进行初始化时&#xff0c;我们应…