QGraphicsItem旋转效果实现(基于Qt)

QGraphicsItem 的旋转效果实现,还是得靠 QPainter 的transform()这个老伙计。用 Qt 写 2D 图形界面的时候,QGraphicsItem挺常见的,是做点动画啊、交互啥的。它自带位置、角度这些属性,挺好用的。想让它动起来?直接上QTransform旋转矩阵,一步到位。

QPainter配合save()restore()来搞局部旋转,不影响其他元素,代码清晰,逻辑也直观。你可以封装成RotatableItem类,角度用私有变量存着,外部调用setRotation()就能动态改角度,做动画也方便。

举个小例子,在paint()方法里这样干:

void RotatableItem::paint(QPainter *qp, const QStyleOptionGraphicsItem *, QWidget *) {
  qp->save();
  QTransform transform;
  transform.translate(boundingRect().center());
  transform.rotate(_angle);
  transform.translate(-boundingRect().center());
  qp->setTransform(transform);
  // 正常绘图逻辑
  qp->drawRect(...);
  qp->restore();
}

想旋转得更顺滑?可以加定时器、事件绑定啥的,更新时记得update()一下。不然你转了 UI 都不知道。boundingRect也要重新计算一下,不然点不到或者显示不全。

虽然 Qt 4.8.1 有点老,但拿来练手、搞懂旋转原理挺合适。等你玩熟了,再去 QML 那边试试,交互更炫,逻辑更清爽。

如果你还想搞缩放、联动控制,推荐下面这些资料看看:

rar
PaintterRotate.rar 预估大小:7个文件
folder
PaintterRotate 文件夹
file
mainwindow.ui 2KB
file
mainwindow.cpp 949B
file
main.cpp 193B
file
MyItem.cpp 2KB
file
mainwindow.h 470B
file
PaintterRotate.pro 370B
file
MyItem.h 581B
rar 文件大小:3.4KB