为已经变换的 QGraphicsItem 设置变换原点
Set transform origin point for an already transformed QGraphicsItem
我有一只机械手,它包含两个相连的移动手臂。当 arm1 旋转时,arm2 也围绕 arm1 的同一原点旋转。当 arm2 旋转时,arm1 不应移动,arm2 应围绕 arm2 原点旋转。
QPixmap arm1(":/new/prefix2/pictures/arm1.png");
QPixmap arm2(":/new/prefix2/pictures/arm2.png");
QGraphicsPixmapItem *arm1p = new QGraphicsPixmapItem(arm1);
QGraphicsPixmapItem *arm2p = new QGraphicsPixmapItem(arm2);
QGraphicsScene *scene = new QGraphicsScene();
arm1p->setScale(scale);
arm1p->deviceTransform(ui->graphicsView->viewportTransform()).map(QPointF(0,0));
arm2p->setScale(scale);
arm2p->deviceTransform(ui->graphicsView->viewportTransform()).map(QPointF(0,0));
以下代码用于围绕 arm1 原点旋转 arm1 和 arm2。
arm1p->setTransformOriginPoint(29,375);
arm1p->setPos(((29*scale)-29)+(390*scale),((375*scale)-375)+(106*scale));
arm1p->setRotation(arm1angle);
arm2p->setTransformOriginPoint(-581,478);
arm2p->setPos(((-581*scale)-(-581))+(1004*scale),((478*scale)-478)+(0*scale));
arm2p->setRotation(arm1angle);
这很管用。
但是当我只想旋转 arm2 时,我希望 arm1 和 arm2 保持它们的位置并且只是围绕不同的原点旋转 arm2。我写了下面的代码,但效果不佳。
arm1p->setTransformOriginPoint(29,375);
arm1p->setPos(((29*scale)-29)+(390*scale),((375*scale)-375)+(106*scale));
arm1p->setRotation(arm1angle);
arm2p->setTransformOriginPoint(-581,478);
arm2p->setPos(((-581*scale)-(-581))+(1004*scale),((478*scale)-478)+(0*scale));
arm2p->setRotation(arm1angle);
arm2p->setTransformOriginPoint(97,148);
arm2p->setRotation(arm2angle);
如何让 arm2 绕其原点旋转,同时保持 arm1 旋转的旋转和位置?
问题已经简单地通过使用setOffset
和mapFromItem
解决了,最终代码是:
QPointF c1 = arm1p->mapFromItem(bodyp,423,188);
arm1p->setOffset(-29,-375);
arm1p->setPos(c1.x()*scale,c1.y()*scale);
arm1p->setRotation(arm1angle);
QPointF c2 = arm2p->mapFromItem(arm1p,712-29,42-375);
arm2p->setOffset(-97,-148);
arm2p->setPos(c2.x()*scale,c2.y()*scale);
arm2p->setRotation(arm1angle + arm2angle);
我有一只机械手,它包含两个相连的移动手臂。当 arm1 旋转时,arm2 也围绕 arm1 的同一原点旋转。当 arm2 旋转时,arm1 不应移动,arm2 应围绕 arm2 原点旋转。
QPixmap arm1(":/new/prefix2/pictures/arm1.png");
QPixmap arm2(":/new/prefix2/pictures/arm2.png");
QGraphicsPixmapItem *arm1p = new QGraphicsPixmapItem(arm1);
QGraphicsPixmapItem *arm2p = new QGraphicsPixmapItem(arm2);
QGraphicsScene *scene = new QGraphicsScene();
arm1p->setScale(scale);
arm1p->deviceTransform(ui->graphicsView->viewportTransform()).map(QPointF(0,0));
arm2p->setScale(scale);
arm2p->deviceTransform(ui->graphicsView->viewportTransform()).map(QPointF(0,0));
以下代码用于围绕 arm1 原点旋转 arm1 和 arm2。
arm1p->setTransformOriginPoint(29,375);
arm1p->setPos(((29*scale)-29)+(390*scale),((375*scale)-375)+(106*scale));
arm1p->setRotation(arm1angle);
arm2p->setTransformOriginPoint(-581,478);
arm2p->setPos(((-581*scale)-(-581))+(1004*scale),((478*scale)-478)+(0*scale));
arm2p->setRotation(arm1angle);
这很管用。 但是当我只想旋转 arm2 时,我希望 arm1 和 arm2 保持它们的位置并且只是围绕不同的原点旋转 arm2。我写了下面的代码,但效果不佳。
arm1p->setTransformOriginPoint(29,375);
arm1p->setPos(((29*scale)-29)+(390*scale),((375*scale)-375)+(106*scale));
arm1p->setRotation(arm1angle);
arm2p->setTransformOriginPoint(-581,478);
arm2p->setPos(((-581*scale)-(-581))+(1004*scale),((478*scale)-478)+(0*scale));
arm2p->setRotation(arm1angle);
arm2p->setTransformOriginPoint(97,148);
arm2p->setRotation(arm2angle);
如何让 arm2 绕其原点旋转,同时保持 arm1 旋转的旋转和位置?
问题已经简单地通过使用setOffset
和mapFromItem
解决了,最终代码是:
QPointF c1 = arm1p->mapFromItem(bodyp,423,188);
arm1p->setOffset(-29,-375);
arm1p->setPos(c1.x()*scale,c1.y()*scale);
arm1p->setRotation(arm1angle);
QPointF c2 = arm2p->mapFromItem(arm1p,712-29,42-375);
arm2p->setOffset(-97,-148);
arm2p->setPos(c2.x()*scale,c2.y()*scale);
arm2p->setRotation(arm1angle + arm2angle);