【问题标题】:How to rotate a QGraphicsPixmap around a point according to mouseMoveEvent?如何根据 mouseMoveEvent 围绕一个点旋转 QGraphicsPixmap?
【发布时间】:2022-01-05 03:31:50
【问题描述】:

我想根据鼠标位置围绕一个点旋转 QGraphicsPixmapItem。

所以我尝试了这个:

void Game::mouseMoveEvent(QMouseEvent* e){
  setMouseTracking(true);
QPoint midPos((sceneRect().width() / 2), 0), currPos;

currPos = QPoint(mapToScene(e->pos()).x(), mapToScene(e->pos()).y());


QPoint itemPos((midPos.x() - cannon->scenePos().x()), (midPos.y() - cannon->scenePos().y()));

double angle = atan2(currPos.y(), midPos.x()) - atan2(midPos.y(), currPos.x());
cannon->setTransformOriginPoint(itemPos);
cannon->setRotation(angle); }

但是像素图移动了几个像素。

我想要这样的结果:

【问题讨论】:

  • atan2 返回弧度。 setRotation 需要度数。
  • 谢谢,现在 qgraphicitem 比以前移动了很多,但似乎 TransformOriginPoint 是错误的......
  • 您的要求不清楚,如果在项目内部的某个点按下它,那么我假设旋转中心就是那个点,对吗?如果是这样,那么旋转的角度是多少?如果不是,旋转中心是什么,角度是多少?另外,如果在外面点击该项目会发生什么?

标签: c++ qt qgraphicsitem


【解决方案1】:

除了@rafix07 指出的角度和弧度的混合之外,角度计算中存在一个错误。您基本上需要从midPoscurrPos 的线的角度,您可以通过

double angle = atan2(currPos.y() - midPos.y(), currPos.x() - midPos.x());

此外,变换原点的计算假定了错误的坐标系。原点必须在相关项目的坐标系中给出(参见QGraphicsItem::setTransformOriginPoint),而不是在场景坐标中。由于您想围绕该项目的中心旋转它只是:

QPointF itemPos(cannon->boundingRect().center());

然后有一个问题,midPos 是否真的是你的图像中在佳能中间突出显示的点。 y 坐标设置为 0,通常是屏幕的边缘,但您的坐标系可能不同。 我会假设上面计算的itemPos 是正确的点,您只需要将它映射到场景坐标(cannon->mapToScene(itemPos))。

最后,我强烈建议不要将场景坐标(即doubles)舍入为ints,因为它在代码中通过强制它为QPoints 而不是QPointFs 完成。处理场景坐标时只需使用QPointF

【讨论】:

    猜你喜欢
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多