为已经转换的 QGraphicsItem 设置转换原点

Posted

技术标签:

【中文标题】为已经转换的 QGraphicsItem 设置转换原点【英文标题】:Set transform origin point for an already transformed QGraphicsItem 【发布时间】:2020-11-11 02:06:33 【问题描述】:

我有一只机械手,其中包含两个相连的移动臂。当 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 旋转的旋转和位置?

【问题讨论】:

您必须在分层树中设置您的项目。看看Drag and Drop Robot Example - 特别是Robot::Robot() 的部分。 非常感谢您的评论。我会检查并希望它有效。 【参考方案1】:

使用setOffsetmapFromItem 已经解决了问题,最终代码是:

    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);

【讨论】:

以上是关于为已经转换的 QGraphicsItem 设置转换原点的主要内容,如果未能解决你的问题,请参考以下文章

QGraphicsItem 类型转换

QGraphicsItem - 项目转换失败

如何识别QGraphicsItem和QGraphicsTextItem-CSDN论坛

Qt/PyQt:QGraphicsItem vs. QGraphicsWidget 几何、位置、鼠标交互

QGraphicsItem setTransformOriginPoint 似乎被忽略了

Qt:如何调整 QGraphicsItem 以动态改变大小