自定义QGraphicsItem实现平移、改变尺寸和旋转

我们在使用QGraphicsView框架的时候,经常需要自定义QGraphicsItem,并且需要实现Item的平移、改变大小和旋转的效果。接下来介绍他们的一种实现方式

1. 平移

平移效果如下图所示:
平移效果

实现方式有两种方法:

  1. 使用QGraphicsItem本身的移动标志实现。

  1. 通过重写鼠标的相关事件实现。

这里需要重写下面三个函数:

这里只贴出关键部分实现代码:

这里 mousePressEvent 中保存了鼠标点击试的状态信息,包括鼠标点击时Item的本地坐标,场景坐标和该Item所在场景的坐标。 函数 mouseMoveEvent 中,获取鼠标移动的场景坐标位置计算偏移并设置新的Item的位置,从而实现平移效果。

2. 改变尺寸

改变尺寸效果如下图所示:
QGraphicsItem改变尺寸
这里同样时通过重写 mousePressEventmouseMoveEventmouseReleaseEvent 实现。

关键部分代码如下:

因为我这里的绘制的大小主要是通过 m_size ,改变 m_size 就是更改了 QGraphicsItem 的显示尺寸。本例子中的坐标系的中心点就是 m_size 的中心点。因此 itemWidth 的计算值为表示为:
qreal itemWidth = abs(loacalPos.x()) * 2 – m_nInterval – m_nEllipseWidth;
loacalPos.x() 为本地坐标系的 x* 轴坐标, \2 正好为实际的宽度,这里的
m_nIntervalm_nEllipseWidth** 表示图片和选择框之间的间距和拖拽手柄的半径。

3. 旋转

旋转效果如下图所示:
QGraphicsItem旋转

本篇文章讲述的旋转方法步骤如下:

  1. 计算上一次鼠标移动和本次鼠标移动位置之间的角度。
  2. 计算旋转的方向。
  3. 根据计算的角度和方向,计算真正的选中角度(顺时针为正,逆时针为负),为 QGraphicsItem 本身设置变换矩阵。

那么如何计算角度和方向呢??

  • 通过向量的 点乘 ,计算角度。单位向量点乘的值,正好为角度的余弦。
  • 通过向量的 叉乘 ,计算旋转的方向。叉乘的结果为与这两个向量垂直的向量,可以通过Z轴结果判断,如果结果为正表示顺时针,结果为负表示逆时针。

关键部分代码如下:

函数 normalize 表示转化为单位向量。
函数 QVector2D::dotProduct 计算两个向量的点乘结果。
函数 QVector3D::crossProduct 计算两个向量的叉乘,这里需要根据向量的Z值计算选装的方向,把2D的向量转化了3D向量作为函数的输入。


完整代码如下:
头文件

源文件:

函数 mouseMoveMoveOperatormouseMoveResizeOperatormouseMoveRotateOperator 就是平移、改变尺寸、旋转的处理函数

You May Also Like

About the Author: admin

喜欢编程、爱游戏,更爱生活。

发表评论

电子邮件地址不会被公开。