初学Qt(Day04)

news2024/11/24 19:32:28

今日目标

创建一个类似游戏手柄的窗口,每次鼠标点击拖动手柄,在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.coloradmin.cn/o/574958.html

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

相关文章

Makefile基础教学(include的使用方法)

文章目录 前言一、include在makefile中的概念介绍二、include使用示例三、include中需要注意的一些操作1. 在include前加-选项2. include触发规则创建了文件会发生什么3. include包含的文件夹存在 总结 前言 本篇文章将讲解include的使用方法,在C语言中使用include…

chatgpt赋能python:Python与SEO的奇妙关系

Python与SEO的奇妙关系 SEO(Search Engine Optimization),中文翻译为搜索引擎优化,是指通过对网站进行各种技术和内容方面的优化,来提升网站在搜索引擎自然排名中的位置,进而吸引更多的潜在客户。而Python语言,则成为…

jQuery-attr()、val()、add()属性和each函数

<!DOCTYPE HTML> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>jQuery-attr()、add()属性和each函数</title> <script type"text/j…

[数据集][目标检测]数据集VOC格式绝缘子缺陷检测数据集VOC-4086张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;4086 标注数量(xml文件个数)&#xff1a;4086 标注类别数&#xff1a;3 标注类别名称:["jueyuanzi",&…

25 VueComponent 的生命周期

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 测试用例如下, 一个简单的 按钮事件的触发 问题的调试 这里…

Linux——网络套接字3|Tcp客户端编写②

根据我们前面写的服务器,server端需要绑定,而client要不要bind呢? 不需要,因为客户端一旦和一个非常具体的端口号绑定,可能会导致端口号绑定多个客户端,因此可能会出现某个客户端无法启动。而服务器需要明确的端口号,因为服务器面对的是众多的客户端,服务器端口号一旦被…

c++ 11标准模板(STL) std::map(五)

定义于头文件<map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class map;(1)namespace pmr { template <class Key, class T, clas…

ros学习

1创建工作空间 catkin_init_workspace 将文件夹初始化成ros文件 编译工作空间catkin_make vi ~/.bashrc 加入环境变量bashrc一下在任何终端都生效 catkin_create_pkg learning_communication通讯机制 std_msgs数据结构 rospy roscpp catkin_create_pkg mbot_description ur…

雅思备考经验!阅读 8.5,听力 8.5!

成绩单 先上热乎乎的成绩单截图&#xff08;2023.5.19 考试&#xff09;&#xff0c;偏科选手出来挨打&#xff01;好在小分都达到了要求~ 英语基础 大概是两三年前考过托福和 GRE&#xff0c;成绩过期了没办法&#xff0c;只能重考&#xff0c;这次试试雅思。 雅思和托福的…

14-Vue技术栈之Vue3快速上手

目录 1.Vue3简介2. Vue3带来了什么2.1 性能的提升2.2 源码的升级2.3 拥抱TypeScript2.4 新的特性 1、海贼王&#xff0c;我当定了&#xff01;——路飞 2、人&#xff0c;最重要的是“心”啊&#xff01;——山治 3、如果放弃&#xff0c;我将终身遗憾。——路飞 4、人的梦想是…

【软考系统规划与管理师笔记】第3篇 信息技术知识2

目录 1 计算机网络 1.1网络技术标准、协议与应用 Internet技术及应用 2 标识技术 域名系统和统一资源定位器 3 网络分类、组网和接入技术 3.1 网络分类 3.2 网络交换技术 3.3 网络接入技术 3.4 无线网络技术 4 网络服务器和网络存储技术 4.1 服务器 4.2 网络存储技…

24 memcmp 的调试

前言 同样是一个 很常用的 glibc 库函数 不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 内存数据的比较 不过 我们这里是从 具体的实现 来看一下 它的实现 主要是使用 汇编 来进行实现的, 因此 理解需要一定的基础 测试用例 就是简单的使用了一下 memcpy,…

【Python】正则表达式应用

知识目录 一、写在前面✨二、姓名检查三、解析电影排行榜四、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是初心&#xff0c;希望我们一路走来能坚守初心&#xff01; 今天跟大家分享的文章是 正则表达式的应用 &#xff0c;希望能帮助到大家&#xff01;本篇…

Makefile基础教程(路径搜索)

文章目录 前言一、常用的源码管理方式二、VPATH和vpath1.VPATH2.vpath3.VPATH和vpath优缺点对比 三、VPATH和vpath同时出现make会怎么处理四、vpath指定多个文件夹总结 前言 在前面的文章中我们的文件全部都是放在同一个目录下面的&#xff0c;那么在实际的工程开发中会这样做…

阿里云服务器备份到本地 镜像 快照 OSS存储 (保姆级图文)

目录 省钱措施1. 创建自定义镜像2. 导出镜像创建/选择OSS对象存储空间 3. 下载到本地总结 欢迎关注 『发现你走远了』 博客&#xff0c;持续更新中 欢迎关注 『发现你走远了』 博客&#xff0c;持续更新中 阿里云的这个官方步骤要收几毛钱的费用 因为他要求必须先快照镜像&…

通过一个平面几何题来梳理解题模型

昨天一位邻居在群里问了一道题目&#xff1a; 已知&#xff1a;如图&#xff0c;OA平分∠BAC&#xff0c;∠1∠2&#xff0e;求证&#xff1a;△ABC是等腰三角形&#xff0e; 先不讲如何来解答这个题目&#xff0c;重点是我们来分析这道题到底在考察什么&#xff0c;如果条件换…

使用ScreenToGif录制GIF动态图

文章目录 1.下载ScreenToGif工具2. 下载后双击下面的.msi文件进行安装3. 在编辑器中可以对所有帧添加文字描述 1.下载ScreenToGif工具 链接&#xff1a;https://pan.baidu.com/s/1rvFZSbMdNus90hbzxsJlGA 提取码&#xff1a;gyqe2. 下载后双击下面的.msi文件进行安装 按照默认…

springboot高校专业招生信息管理系统jsp001

对于学校来说&#xff0c;每年的学生越来越多&#xff0c;需要管理的专业也有很多&#xff0c;每次专业报名信息的统计工作就变得非常的多&#xff0c;对于报名的统计工作变得非常的复杂。进入二十一世纪后&#xff0c;各种科学技术发速发展&#xff0c;管理软件尤其明显&#…

Golang每日一练(leetDay0078) 存在重复元素 II\III ContainsDuplicate

目录 219. 存在重复元素 II Contains Duplicate ii &#x1f31f; 220. 存在重复元素 III Contains Duplicate iii &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏…

chatgpt赋能python:Python判断语句:if语句

Python判断语句&#xff1a;if语句 在Python编程中&#xff0c;判断语句是非常重要的语法之一。if语句是最基本的判断语句&#xff0c;可以根据条件的真假来执行我们需要的代码块。 什么是if语句&#xff1f; if语句是一种条件语句。在Python中&#xff0c;if语句用于执行一…