首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为已转换的QGraphicsItem设置转换原点

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

Stack Overflow用户
提问于 2020-11-11 10:06:33
回答 1查看 65关注 0票数 2

我有一只机械手,它包含两个相连的移动手臂。旋转arm1时,arm2也会围绕arm1的同一原点旋转。旋转arm2时,arm1不应移动,arm2应绕arm2原点旋转。

代码语言:javascript
复制
    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。

代码语言:javascript
复制
    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。我写了以下代码,但它不能很好地工作。

代码语言:javascript
复制
    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围绕原点旋转,同时保持is旋转和位置不受arm1旋转的影响?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-17 09:29:25

这个问题已经通过简单地使用setOffsetmapFromItem解决了,最后的代码是:

代码语言:javascript
复制
    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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64779452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档