Qt-系统相关(1)事件文件

news2024/11/27 17:54:40

Qt事件

事件介绍

事件是应⽤程序内部或者外部产⽣的事情或者动作的统称。在 Qt 中使⽤⼀个对象来表⽰⼀个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。当⽤⼾按下⿏标、敲下键盘,或者是窗⼝需要重新绘制的时候,都会发出⼀个相应的事件。⼀些事件是在⽤⼾操作时发出,如键盘事件、⿏标事件等,另⼀些事件则是由系统本⾝⾃动发出,如定时器事件。常⻅的 Qt 事件如下

 信号槽就是对事件的封装,事件是信号槽的底层机制。

信号槽中是通过connect来关联信号和槽函数的,在事件这里,需要让当前的类重写某个事件处理函数,这里用到的是多态的机制,创建子类,让其继承自Qt的类,然后在子类中重写虚函数,后续事件触发的过程中,就会通过多态这样的机制,执行到我们自己重写的虚函数。

事件的处理

事件处理⼀般常⽤的⽅法为:重写相关的 Event 函数。 

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

创建项目时,这里的演示基类选择QWidget

 1.接着,在ui界面中,我们可以先创建一个QLabel

2.然后

给它设置一个边框,这样可以方便的观察进出

 3.然后创建一个新的类,让它继承自QLabel

创建好后,项目中就会多出两个新的文件

4.用帮助文档进行查询,在重写虚函数这里,要经常使用到帮助文档

复制好后,粘贴到mylabel的头文件中

5.重写该虚函数

6.将之前创建的QLabel进行类型提升

这里输入我们之前自定义的类型,然后点击添加

然后再点击提升

7.再修改MyLabel的基类

 

8.运行程序 

结果符合预期。

当鼠标进入时,label随机移动 

我们还可以设计一下,使我们的鼠标刚进入label就让这个label在窗口内随机移动

因为MyLabel在ui这个对象中·,ui这个对象指针又在Widget中,因此我这里给MyLabel设置了两个公有成员变量,来记录Widget的窗口大小。

然后,在Widget的构造函数中对其进行了赋值

当⿏标点击时,获取对应的坐标值 

 在上述⽰例的基础上,在 mylabel.h 中声明 mousePressEvent() ⽅法;

依旧还是先在文档中进行查询

重写虚函数 

 为了防止干扰,先把之前的飞雷神功能注释掉

对于某些事件,比如鼠标移动事件,Qt程序为了保证流畅性,默认情况下不会对鼠标移动进行追踪,也就是鼠标移动时不会调用 mouseMoveEvent,除非显示告诉Qt需要开启追踪。

 鼠标滚轮事件

重写虚函数

鼠标双击事件 

⿏标双击事件是通过虚函数:mouseDoubleClickEvent() 来实现的。

 

鼠标释放事件

⿏标释放事件是通过虚函数 mouseReleaseEvent() 来捕获的。 

 

定时器 

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

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

QTimer的背后就是QTimerEvent定时器事件支撑的。

使用 QTimerEvent实现定时器

在 "widget.h" 头⽂件中声明 timerEvent() 函数 

 先通过 startTimer来启动一个定时器,并返回一个timer_id。这个id可以类似于Linux中的文件描述符,起到一个标识身份的效果。

先声明一个变量用来保存定时器的id,然后在构造函数中启动定时器

重写虚函数

使用 QTimer类实现定时器

在Widget中添加一个QTimer对象指针,然后在构造函数中初始化 ,并关联槽函数

 槽函数的实现:

Qt文件 

我们之前也学过了一些关于文件的操作:

在 Qt 中,⽂件读写的类为 QFile 。QFile 的⽗类为 QFileDevice ,QFileDevice 提供了⽂件交互操作的层功能。 QFileDevice 的⽗类是 QIODevice,QIODevice 的⽗类为 QObject 。

关于上述的类: 

QFile 是⽤于⽂件操作和⽂件数据读写的类,使⽤ QFile 可以读写任意格式的⽂件。
QSaveFile 是⽤于安全保存⽂件的类。使⽤ QSaveFile 保存⽂件时,它会先把数据写⼊⼀个临时⽂
件,成功提交后才将数据写⼊最终的⽂件。如果保存过程中出现错误,临时⽂件⾥的数据不会被写
⼊最终⽂件,这样就能确保最终⽂件中不会丢失数据或被写⼊部分数据。 在保存⽐较⼤的⽂件或复
杂格式的⽂件时可以使⽤这个类,例如从⽹络上下载⽂件等。
QTemporaryFile 是⽤于创建临时⽂件的类。使⽤函数 QTemporaryFile::open() 就能创建⼀个⽂件
名唯⼀的临时⽂件,在 QTemporaryFile 对象被删除时,临时⽂件被⾃动删除。
QTcpSocket 和 QUdpSocket 是分别实现了 TCP 和 UDP 的类。
QSerialPort 是实现了串⼝通信的类,通过这个类可以实现计算机与串⼝设备的通信。
QBluetoothSocket 是⽤于蓝⽛通信的类。⼿机和平板计算机等移动设备有蓝⽛通信模块,笔记本
电脑⼀般也有蓝⽛通信模块。通过QBluetoothSocket类,就可以编写蓝⽛通信程。如编程实现笔
记本电脑与⼿机的蓝⽛通信。
QProcess 类⽤于启动外部程序,并且可以给程序传递参数。
QBuffer 以⼀个 QByteArray 对象作为数据缓冲区,将 QByteArray 对象当作⼀个 I/O 设备来读写。

关于QFile类 

读数据:QFile 类中提供了多个⽅法⽤于读取⽂件内容;如 read()、readAll()、readLine()等。
写数据:QFile 类中提供了多个⽅法⽤于往⽂件中写内容;如 write()、writeData()等。
关闭⽂件:⽂件使⽤结束后必须⽤函数 close() 关闭⽂件。

访问⼀个设备之前,需要使⽤ open()函数 打开该设备,⽽且必须指定正确的打开模式,QIODevice 中所有的打开模式由 QIODevice::OpenMode 枚举变量定义

QIODEvice继承自QIODeviceBase,在QIODeviceBase中有一个enum: 

 

 

读取⽂件内容 

 

 这里用了一个垂直布局管理器

点击按钮就会打开一个文件对话框

 代码:

打开的效果:
 

这里的read接口

 

它的返回值其实是一个QByteArray,但是它可以直接转化成一个QString,所以我们直接用QString接收了。

关于文件打开后,不用了一定要记得关闭。因为文件描述符表存在上限,如果对打开的文件一直不关闭,那么就会使文件描述符表被占满,后续就不能打开文件了。

另外,我们这里打开的是一个文本,用QString接收内容没关系,但如果是二进制文件,此时交给QString就不合适了。 

追加写文件 

 

代码:
 

结果:

 

确实写上去了,只是没有换行。

 

⽂件和⽬录信息类 

QFileInfo 是 Qt 提供的⼀个⽤于获取⽂件和⽬录信息的类,如获取⽂件名、⽂件⼤⼩、⽂件修改⽇期等。QFileInfo类中提供了很多的⽅法,常⽤的有:

 

isDir() 检查该⽂件是否是⽬录;
isExecutable() 检查该⽂件是否是可执⾏⽂件;
fileName() 获得⽂件名;
completeBaseName() 获取完整的⽂件名;
suffix() 获取⽂件后缀名;
completeSuffix() 获取完整的⽂件后缀;
size() 获取⽂件⼤⼩;
isFile() 判断是否为⽂件;
fileTime() 获取⽂件创建时间、修改时间、最近访问时间等

 

 获取文件信息

 

 

 

 

 

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

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

相关文章

HarmonyOS4+NEXT星河版入门与项目实战(20)------状态管理@ObjectLink @Observed

文章目录 1、用法图解2、案例实现1、任务类改造2、参数改造变量3、完整代码4、运行效果4、总结1、用法图解 2、案例实现 上一节的案例中,一直有一个功能没有生效,就是任务完成后对应的任务行变灰,任务字体出现中划线删除的效果。而该功能一直不生效的原因就是要改变的数据值…

【小白学机器学习36】关于独立概率,联合概率,交叉概率,交叉概率和,总概率等 概念辨析的例子

目录 1 先说结论 2 联合概率 3 边缘概率 4 (行/列)边缘概率的和 总概率1 5 条件概率 5.1 条件概率的除法公式 5.2 条件概率和联合概率区别 1 先说结论 关于独立概率,联合概率,交叉概率,交叉概率和,总概率 类型含义 …

TCP IP协议和网络安全

传输层的两个协议: 可靠传输 TCP 分段传输 建立对话(消耗系统资源) 丢失重传netstat -n 不可靠传输 UDP 一个数据包就能表达完整的意思或屏幕广播 应用层协议(默认端口): httpTCP80 网页 ftpTCP21验证用户身…

redmi 12c 刷机

刷机历程 一个多月前网购了redmi 12c这款手机, 价格只有550,用来搞机再适合不过了, 拆快递后就开始倒腾,网上有人说需要等7天才能解锁,我绑定了账号过了几天又忍不住倒腾,最后发现这块手机不用等7天解锁成功了,开始我为了获取root权限, 刷入了很火的magisk,但是某一天仍然发现/…

分布式在线评测系统

OnlineJudge 前言所用技术开发环境 1. 需求分析2. 项目宏观结构3. compile_server服务设计3.1 compiler服务设计3.2 runner服务设计3.3 compile_run3.4 compile_server.cpp 4. oj_server服务设计4.1 model设计4.2 view设计4.3 control设计4.3.1 获取题目列表功能4.3.2 获取单个…

政安晨【零基础玩转各类开源AI项目】探索Cursor-AI Coder的应用实例

目录 Cusor的主要特点 Cusor实操 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! Cursor 是 Visual Studio Code 的一个分支。这使我们能够…

第三届航空航天与控制工程国际 (ICoACE 2024)

重要信息 会议官网:www.icoace.com 线下召开:2024年11月29日-12月1日 会议地点:陕西西安理工大学金花校区 (西安市金花南路5号) 大会简介 2024年第三届航空航天与控制工程国际学术会议(ICoACE 2024&a…

Vue前端开发2.3.5 条件渲染指令

本文介绍了Vue中两种条件渲染指令:v-if和v-show。v-if通过布尔值控制元素的DOM树存在,适用于不频繁切换显示状态的场景;v-show则通过CSS的display属性控制显示,适合频繁切换。通过创建单文件组件示例,演示了如何使用这…

初级数据结构——二叉树题库(c++)

这里写目录标题 前言[1.——965. 单值二叉树](https://leetcode.cn/problems/univalued-binary-tree/)[2.——222. 完全二叉树的节点个数](https://leetcode.cn/problems/count-complete-tree-nodes/)[3.——144. 二叉树的前序遍历](https://leetcode.cn/problems/binary-tree-…

Java基础——(一)Java概述

Java特性 简单性:Java与C很相似,但剔除了C中许多比较复杂并且很少使用的功能,比如头文件、指针运算、结构、联合、操作符重载、虚基类等,从而使Java更易于上手、学习。面向对象:Java是一门面向对象语言,具…

打造智能化在线教育平台详解:教培网校APP的架构设计与实现

本篇文章,小编将以教培网校APP的架构设计与实现为核心,深入探讨如何打造一套智能化的在线教育平台,为企业和教育机构提供落地参考。 一、在线教育平台的核心功能需求 构建一个高效的教培网校APP,首先需要明确其核心功能需求。一…

Java学习笔记--继承的介绍,基本使用,成员变量和成员方法访问特点

目录 一,继承 1.什么是继承 2.怎么去继承: 3.注意: 4.继承怎么学 二,继承基本使用 三,成员变量和成员方法访问特点 1.成员变量访问特点 1,子类和父类中的成员变量不重名: 总结: 2,子类和父类中的成员变量重…

IDEA2024创建一个spingboot项目

以下是创建一个基本的 Spring Boot 项目的步骤和示例: 初始化一个springboot工程其实有许多方法,笔者这里挑了一个最快捷的方式搭建一个项目。我们直接通过官方平台(start.spring.io)进行配置,然后下载压缩包就可以获取…

【Leetcode】3206.交替组1

题目描述: https://leetcode.cn/problems/alternating-groups-i/description/?envTypedaily-question&envId2024-11-26 题目示例: 解题思路 思路一: 1.如果color.size()小于等于2,则构不成环,直接返回结果…

利用Docker容器技术部署发布web应用程序

Docker是什么? docker 是一个开源的应用容器引擎,可以帮助开发者打包应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何…

问题:smart监控没有能流的问题? smart200与维纶屏

目前路由器网口连接一台电脑,一个伺服,一个smart200从站,一个smart200主站,还有一个mt9106iq维纶屏。 用smart主站监控,发现没有能流。拔掉维纶屏网线,就可以正常显示能流。请问各位老师傅,这个…

微软Ignite 2024:建立一个Agentic世界!

在今年的Microsoft Ignite 2024上,AI Agent无疑成为本次大会的重点,已经有十万家企业通过Copilot Studio创建智能体了。微软更是宣布:企业可以在智能体中,使用Azure目录中1800个LLM中的任何一个模型了! 建立一个Agent…

【Ubuntu】E: Unable to locate package xxx

报错描述 在 Ubuntu 上 执行 apt install xxx 出现下面的报错: 即无法定位到该 Package,一般形式如下: # apt install xxx Reading package lists... Done Building dependency tree... Done Reading state information... Done E: Unable …

go语言逆向-基础basic

文章目录 go 编译命令 ldflags -w -s的作用和问题使用 file 命令查看文件类型 go 语言逆向参考go ID版本GOROOT和GOPATHGOROOTGOPATHGOROOT和GOPATH的关系示例 go build和 go modpclntab (Program Counter Line Table 程序计数器行数映射表)Moduledata程…

RL78/G15 Fast Prototyping Board Arduino IDE 平台开发过程

这是一篇基于RL78/G15 Fast Prototyping Board的Arduino IDE开发记录 RL78/G15 Fast Prototyping Board硬件简介(背景)基础测试(方法说明/操作说明)开发环境搭建(方法说明/操作说明代码结果)Arduino IDE RL…