初学Qt(Day04)

news/2024/11/15 6:50:43/

今日目标

创建一个类似游戏手柄的窗口,每次鼠标点击拖动手柄,在qt开发界面输出坐标,每当松开鼠标,手柄自动复位。
目标是实现类似下面这种
在这里插入图片描述

先说结论(免得我又忘记了):没写完,是一开始想的太简单(的确看起来比较简单)下午才开始写,晚上又约好了去打球,就没写出来,明天继续写。在这里先说一下我的想法:
首先找两张图片,一张做手柄,一张做手柄底座。

  • 设置好之后,设置鼠标事件限制在手柄的背景中
  • 如果按住鼠标,这个时候鼠标移动,那么手柄也是需要跟着移动的
  • 重要的是移动过程中鼠标和手柄的相对位置是不变的,而且窗口不断输出鼠标在窗口中的坐标,而且需要保证鼠标是在手柄对应的控件中的。比如说如果我在移动过程中鼠标越出了手柄的范围,那么平台只会不断显示最后出现在手柄对应控件中的位置
  • 这时候松开鼠标,手柄控件会复位

上面说的都是难点,关于第三点中的不断输出坐标,我当时想的太简单了,定时器的想法只是一闪而过。明天再实现吧
还有就是移动过程中鼠标和手柄的相对位置是不变的,有三种实现思路,都是需要用到定时器,但是槽函数中的实现方法是不一样的

  • 使用x,y的变化的差,在当鼠标被点击的时候connect执行并且记录这个时候的鼠标(窗口)的位置,设置为初始位置,触发槽函数,在槽函数中记录移动后的的鼠标位置(这个地方到时候应该是设置成静态的)不断使用记录的鼠标位置,再把这个记录的位置赋值给手柄控件,实现两者的相对位置不变
  • 还有一种方法是重绘,也就是重新绘制这个控件,哪个时候的控件也是画出来的,因为我还没接触,所以后面只贴一个回答就好了,自己也没有多少理解
  • 还有一种方法也是最不推荐的一种方法,就是再定时器中记录鼠标的移动位置,不断删除手柄控件,再新建一个新的相同的手柄控件,和之前删除的手柄控件唯一的不同就是,这个手柄控件是鼠标当前的位置,我都疑惑我怎么想到这个方法的,这样内存不得爆炸或者卡死了,不断申请空间释放空间。。。

还有就是设置Mousetracking()这个是设置是否跟踪鼠标走向的。
感觉自己把qt里面的事件想成linux的event了,没有彻底理解qt中的事件。qt中的事件是不需要执行的,只需要定义就可以了,另外qt中的Mousemove,press,release函数都是虚函数,既可以重载也可以不重载,如果父类中是纯虚函数,那么再子类中是必须要重写的

还有就是关于手柄控件复位的做法:
使用x,y的变化的差,在当鼠标被点击的时候connect执行并且记录这个时候的鼠标(窗口)的位置,设置为初始位置,触发槽函数,把鼠标的释放作为出发定时器stop的标志,这个时候执行槽函数中的操作,之后松开鼠标,槽函数执行完毕,这个时候就相当于松开鼠标了,再重新设置手柄控件的位置(setGeometry()函数)为初始位置。
关于为什么重绘事件与其他事件与众不同的回答:
Qt中的重绘与其他事件处理是有所不同的。具体来说,重绘(repaint)是一种特殊的事件,在Qt中被称为绘图事件。它与其他事件处理的不同之处在于:

  1. 触发时机:重绘事件并非由用户输入触发,而是由系统在需要更新窗口或控件的外观时自动触发。例如,当窗口被最小化、最大化、恢复或移动时,需要重新绘制窗口边框和标题栏。此外,当窗口或控件被遮挡部分被移开,需要重新显示被遮挡的区域时,也会触发重绘事件。

  2. 响应方式:重绘事件的处理与其他事件处理的方式不同。通常,其他事件处理会在事件发生后立即响应,例如键盘输入、鼠标单击等。而重绘事件的处理则是需要在适当的时机进行绘图操作,并将更新后的图像显示到屏幕上。因此,在处理重绘事件时,需要确保绘图操作的正确性和效率,以避免出现视觉上的问题或影响应用程序性能。

  3. 调用方法:重绘事件的处理涉及到重绘区域的计算、绘图操作和刷新屏幕等过程。因此,在Qt中,重绘事件的处理是通过paintEvent()函数来实现的,它是QPaintDevice类的虚函数,必须在子类中进行重写和实现。而其他事件处理则有其对应的处理函数,例如keyPressEvent()、mousePressEvent()等。

综上所述,Qt中的重绘事件与其他事件处理有所不同,需要特别关注其触发时机、响应方式和调用方法,并进行适当的处理以保证应用程序的正确性和性能。
在Qt中,重绘(repaint)与其他GUI框架的实现方式有所不同。具体来说,Qt的重绘机制是通过两个独立但协同工作的概念来实现的:in-memory bitmap和paint device。

  • in-memory bitmap:这是一个内存中的位图,它存储了窗口或控件的当前状态,在绘制过程中用于保存将要被更新的区域。它是使用QPixmap和QImage类等Qt提供的图像处理类来表示和操作的。

  • paint device:这是一个抽象的绘图设备,可以为各种输出设备、屏幕和打印机等提供绘图功能。它是通过QPainter类来实现的,QPainter类是一个高级绘图API,提供了许多方便的方法来绘制各种形状、线条、文本和图像等元素。

当需要重绘一个窗口或控件时,Qt会调用系统的paintEvent()函数来处理绘图请求,然后调用QPainter对象的begin()/end()方法开始/结束绘图过程,将绘图操作发送到in-memory bitmap中,在完成所有绘图操作后,再将in-memory bitmap中的内容复制到屏幕上,完成整个绘图流程。

与其他GUI框架不同的是,Qt的重绘机制采用了双缓冲技术,即在in-memory bitmap中绘制屏幕上将要显示的内容,以避免闪烁和视觉不连续,提高用户体验。同时,Qt还提供了一些优化技术,如OpenGL加速、局部重绘等,以提高绘图效率。

因此,Qt的重绘机制可以说是与众不同的,并且在绘图效果和性能方面都有很好的表现。


http://www.ppmy.cn/news/93208.html

相关文章

Systrace系列5 —— SurfaceFlinger 解读

本文主要是对 SurfaceFlinger 进行简单介绍,介绍了 SurfaceFlinger 中几个比较重要的线程,包括 Vsync 信号的解读、应用的 Buffer 展示、卡顿判定等,由于 Vsync 这一块在Systrace 基础知识 - Vsync 解读 和 Android 基于 Choreographer 的渲染机制详解 这两篇文章里面已经介…

提示msvcr120.dll丢失怎么办?由于找不到msvcr120.dll如何修复?

msvcr120.dll 是 Microsoft Visual C 文件中的一个重要组件。它是一种动态链接库,包含了很多函数,提供了许多基础的 C 运行时支持。这个库文件的主要功能是提供 C 应用程序的运行时环境,它是一些常用的 C 运行时库文件的集合。这些库包括了 m…

python+vue高校体育比赛赛事信息系统

本公共体育赛事管理系统是一个公共体育赛事管理信息的平台,采用vue,MYSQL的开发环境,后台使用python开发架构,并使用django简化对数据库方面的操作,基于B/S结构进行开发。本系统主要实现用户在线进行密码管理&#xff…

商业建筑 HVAC 电力需求响应综述与分析

商业建筑 HVAC 电力需求响应综述与分析 摘 要 针对空调系统参与电网需求响应所面临的问题,从暖通空调( HVAC) 系统特性的角度,对建筑电网下多种能源交互的 HVAC 需求响应( demand response,DR) 进行综述性研究与分析。概述了 HVAC需求响应的定义和分类,并论述了利用模型预…

从C语言到C++_13(string的模拟实现)深浅拷贝+传统/现代写法

前面已经对 string 类进行了简单的介绍和应用,大家只要能够正常使用即可。 在面试中,面试官总喜欢让学生自己 来模拟实现string类, 最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。 为了更深入学习STL,下面我…

【华为OD机试】高效的任务规划【2023 B卷|200分】

题目描述: 你有 n 台机器编号为 1~n,每台都需要完成完成一项工作,机器经过配置后都能完成独立完成一项工作。 假设第 i 台机器你需要花 B 分钟进行设置,然后开始运行,J 分钟后完成任务。 现在,你需要选择布置工作的顺序,使得用最短的时间完成所有工作。 注意,不能同…

150. 逆波兰表达式求值 Python

文章目录 一、题目描述示例 1示例 2示例 3 二、代码三、解题思路 一、题目描述 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 、-、* 和 / 。每…

SpringCloud入门概述;微服务入门概述

微服务入门概述 入门概述微服务分布式微服务架构Spring Cloud技术栈spring cloud各个组件的使用服务注册服务调用服务降级服务网关服务配置服务总线 参考 入门概述 auther JaneOnly date 2022/11/6 前置课程需要: java8mavengitNginxmqspringboot2.0 微服务 微服务架构就是一…