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 那边试试,交互更炫,逻辑更清爽。
如果你还想搞缩放、联动控制,推荐下面这些资料看看:
PaintterRotate.rar
预估大小:7个文件
PaintterRotate
文件夹
mainwindow.ui
2KB
mainwindow.cpp
949B
main.cpp
193B
MyItem.cpp
2KB
mainwindow.h
470B
PaintterRotate.pro
370B
MyItem.h
581B
3.4KB
文件大小:
评论区