自定义QGraphicsItem 缩放后旋转 图形出现漂移问题
时间: 2024-09-10 20:05:35 浏览: 50
Qt5 自定义QGraphicsItem的选择、缩放、移动、旋转
5星 · 资源好评率100%
在Qt的QGraphicsScene中,自定义QGraphicsItem如果在缩放后旋转图形时出现漂移问题,这通常是因为当你单独处理缩放和平移操作时,没有同时正确地更新旋转中心点。当一个图形在缩放后旋转时,如果旋转中心默认设置为物体的几何中心,随着形状的变化,实际的旋转中心可能会移动,导致看起来像是漂移。
解决这个问题的关键在于在缩放和旋转之前,需要保存并更新图形的原始旋转中心。在QGraphicsItem中,你可以重写`boundingRect()`和`paint()`方法,并维护一个内部变量来存储这个中心点。缩放和平移操作后,记得调整旋转中心。这里是一个简单的示例:
```cpp
class CustomGraphicsItem : public QGraphicsItem {
public:
QPointF originalCenter;
// 在构造函数中初始化旋转中心
CustomGraphicsItem() { originalCenter = boundingRect().center(); }
// 重写旋转、缩放等方法,更新旋转中心
void setRotation(QPointF newRotationCenter, qreal angle) {
rotate(angle);
originalCenter = newRotationCenter;
}
// 其他必要方法...
private:
// 确保在paint()和boundingRect()中使用originalCenter作为旋转中心
QRectF boundingRect() const override {
// 使用originalCenter计算旋转后的矩形
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override {
painter->translate(originalCenter); // 在绘制前先平移回旋转中心
// 绘制图形...
}
};
// 使用时:
CustomGraphicsItem *item = new CustomGraphicsItem();
item->setRotation(item->mapToScene(pivotPoint), angle);
```
阅读全文