我有一个带有正确变换的矩形项目,在场景中显示。它也可以移动。
rectItem = new QGraphicsRectItem();
rectItem->setRect(someRect);
scene->addItem(rectItem);
rectItem->setTransform(homography);
rectItem->setFlag(ItemIsMovable);
问题是,无论何时通过交互移动,按dx
的数量,其rect属性都不会改变。在鼠标释放事件中捕获移动结束,并在那里发出信号 - 连接到此插槽:
finalRect = rectItem->rect(); // this doesnt change, however item is properly moved to another spot on the scene
我原以为:finalRect
应该按homography.inverted().map(dx)
我的假设有问题吗?还是有错误?
答案 0 :(得分:1)
对于rect来说是正常的。请改用pos()
或scenePos()
。
qDebug() << rectItem->rect() << rectItem->pos() << rectItem->scenePos();
rectItem->rect()
将相同,直到您再次致电setRect
,但scenePos()
将相应更改为您的场景。
答案 1 :(得分:1)
QGraphicsRectItem中定义的rect实际上是项目的boundingRect,它位于本地坐标中。如果此更改,该项目将更改其大小。
由于该项目不是父项,设置其坐标并将其添加到场景中将显示通过更改其矩形来设置其位置: -
QRectF rect(10, 10, 20, 20);
rectItem = new QGraphicsRectItem();
rectItem->setRect(someRect);
scene->addItem(rectItem);
此矩形被设置为(x,y)at(10,10),宽度和高度为20.没有父项,将其添加到场景中不仅会将rect的局部坐标定义为( 10,10,20,20),但它的左上角位于(10,10),因此看起来setRect定义了它的位置。
你应该做的是考虑矩形的大小以及你想要它在当地坐标中的位置。例如,您可能希望位置位于其中心,而不是左上角。在这种情况下,您可以执行以下操作: -
QRectF rect(-10, -10, 20, 20);
rectItem = new QGraphicsRectItem();
rectItem->setRect(someRect);
scene->addItem(rectItem);
现在我们已经定义了rect的本地坐标并将其添加到场景中,我们可以将它放置在我们想要的位置: -
rectItem->setPos(15, 15);
矩形现在位于中心位置(15,15)。
为了获得场景中的矩形位置,您可以调用其pos()函数,但请注意返回的坐标是相对于项目的父级。如果没有父项,则返回项目的场景坐标。
如果某个项目是父级,您可以将本地pos()坐标转换为场景,或者只需调用scenePos()