今日目标
创建一个类似游戏手柄的窗口,每次鼠标点击拖动手柄,在qt开发界面输出坐标,每当松开鼠标,手柄自动复位。
目标是实现类似下面这种
先说结论(免得我又忘记了):没写完,是一开始想的太简单(的确看起来比较简单)下午才开始写,晚上又约好了去打球,就没写出来,明天继续写。在这里先说一下我的想法:
首先找两张图片,一张做手柄,一张做手柄底座。
- 设置好之后,设置鼠标事件限制在手柄的背景中
- 如果按住鼠标,这个时候鼠标移动,那么手柄也是需要跟着移动的
- 重要的是移动过程中鼠标和手柄的相对位置是不变的,而且窗口不断输出鼠标在窗口中的坐标,而且需要保证鼠标是在手柄对应的控件中的。比如说如果我在移动过程中鼠标越出了手柄的范围,那么平台只会不断显示最后出现在手柄对应控件中的位置
- 这时候松开鼠标,手柄控件会复位
上面说的都是难点,关于第三点中的不断输出坐标,我当时想的太简单了,定时器的想法只是一闪而过。明天再实现吧
还有就是移动过程中鼠标和手柄的相对位置是不变的,有三种实现思路,都是需要用到定时器,但是槽函数中的实现方法是不一样的
- 使用x,y的变化的差,在当鼠标被点击的时候connect执行并且记录这个时候的鼠标(窗口)的位置,设置为初始位置,触发槽函数,在槽函数中记录移动后的的鼠标位置(这个地方到时候应该是设置成静态的)不断使用记录的鼠标位置,再把这个记录的位置赋值给手柄控件,实现两者的相对位置不变
- 还有一种方法是重绘,也就是重新绘制这个控件,哪个时候的控件也是画出来的,因为我还没接触,所以后面只贴一个回答就好了,自己也没有多少理解
- 还有一种方法也是最不推荐的一种方法,就是再定时器中记录鼠标的移动位置,不断删除手柄控件,再新建一个新的相同的手柄控件,和之前删除的手柄控件唯一的不同就是,这个手柄控件是鼠标当前的位置,我都疑惑我怎么想到这个方法的,这样内存不得爆炸或者卡死了,不断申请空间释放空间。。。
还有就是设置Mousetracking()这个是设置是否跟踪鼠标走向的。
感觉自己把qt里面的事件想成linux的event了,没有彻底理解qt中的事件。qt中的事件是不需要执行的,只需要定义就可以了,另外qt中的Mousemove,press,release函数都是虚函数,既可以重载也可以不重载,如果父类中是纯虚函数,那么再子类中是必须要重写的
还有就是关于手柄控件复位的做法:
使用x,y的变化的差,在当鼠标被点击的时候connect执行并且记录这个时候的鼠标(窗口)的位置,设置为初始位置,触发槽函数,把鼠标的释放作为出发定时器stop的标志,这个时候执行槽函数中的操作,之后松开鼠标,槽函数执行完毕,这个时候就相当于松开鼠标了,再重新设置手柄控件的位置(setGeometry()函数)为初始位置。
关于为什么重绘事件与其他事件与众不同的回答:
Qt中的重绘与其他事件处理是有所不同的。具体来说,重绘(repaint)是一种特殊的事件,在Qt中被称为绘图事件。它与其他事件处理的不同之处在于:
-
触发时机:重绘事件并非由用户输入触发,而是由系统在需要更新窗口或控件的外观时自动触发。例如,当窗口被最小化、最大化、恢复或移动时,需要重新绘制窗口边框和标题栏。此外,当窗口或控件被遮挡部分被移开,需要重新显示被遮挡的区域时,也会触发重绘事件。
-
响应方式:重绘事件的处理与其他事件处理的方式不同。通常,其他事件处理会在事件发生后立即响应,例如键盘输入、鼠标单击等。而重绘事件的处理则是需要在适当的时机进行绘图操作,并将更新后的图像显示到屏幕上。因此,在处理重绘事件时,需要确保绘图操作的正确性和效率,以避免出现视觉上的问题或影响应用程序性能。
-
调用方法:重绘事件的处理涉及到重绘区域的计算、绘图操作和刷新屏幕等过程。因此,在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的重绘机制可以说是与众不同的,并且在绘图效果和性能方面都有很好的表现。