QGraphicsItemGroup 在转换过程中移动
QGraphicsItemGroup moves during transformations
我在 QGraphicsScene
上有 QGraphicsItems
。我需要将它们分组。分组的主要原因:我需要提供一种在组上应用转换的方法。
如果我需要应用单个转换,一切都非常简单,左上角的项目边界矩形位于 0,0。
我已经了解了分组和取消分组的工作原理,保留项目相对于场景的变换,这很棒。但是在分组时,无论我的项目在什么位置,组的坐标都是 (0,0)。
当我尝试任何变换时,无论我对变换原点尝试了什么,项目都会移动。
要显示的简单程序:
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QGraphicsScene s;
QGraphicsView view(&s);
s.setSceneRect(90, -10, 420, 140);
view.show();
QGraphicsRectItem* sceneR = new QGraphicsRectItem(s.sceneRect());
s.addItem(sceneR);
QTransform t; // simple scaling transform
t.scale(2, 1); // adding rotation scares me
QGraphicsRectItem* r0 = new QGraphicsRectItem(QRectF(0, 0, 150, 100)); // for compare, not scaled
r0->setBrush(QBrush(Qt::red));
r0->setPos(100, 0);
s.addItem(r0);
QGraphicsRectItem* r1 = new QGraphicsRectItem(QRectF(0, 0, 150, 100)); // for compare, not scaled
r1->setBrush(QBrush(Qt::blue));
r1->setPos(100, 10);
s.addItem(r1);
QGraphicsRectItem* r2 = new QGraphicsRectItem(QRectF(0, 0, 150, 100)); // will make a group of a single item
r2->setFlags(QGraphicsItem::ItemIsSelectable);
r2->setBrush(QBrush(Qt::green));
r2->setPos(100, 20);
r2->setSelected(true);
s.addItem(r2);
QGraphicsItemGroup* g = s.createItemGroup(s.selectedItems());
// QPointF topLeft = g->mapToScene(g->boundingRect().topLeft());
// g->setTransformOriginPoint(topLeft);
r1->setTransform(t);
g->setTransform(t);
qDebug() << r1->pos() << r1->transform();
qDebug() << g->pos() << g->transform();
return app.exec();
}
如果我应用转换,分组的项目就会移动。我一直没能弄清楚逻辑或如何补偿。
(红色 = 参考,未缩放;蓝色,参考,缩放;绿色,分组和缩放)
在上图中,我希望绿色矩形与蓝色矩形具有相同的 x 坐标(我垂直移动以查看发生了什么)
如何使缩放(和旋转)到位?
(我正在考虑仅设置一个公共父级并执行所有工作以检索项目转换的替代方案,但不确定如何正确组合它们,尤其是缩放组如何找到新位置和新比例内部项目)
找到解决方案 - 尽管我指望小组执行项目转换并计算自己的边,但我也必须手动完成。
步骤:
我找到所选项目的边界矩形(映射到场景)的最左上角 (minX, minY)
,
然后将所有项目移动 -minX, -minY
、
然后分组后,按 minX, minY
.
移动组
这设置了正确的转换中心,因此组项目的行为与常规项目一样。它还在其左上角报告一个 pos()
,类似于其他 QGraphicsItems
的默认 pos()
。
我在 QGraphicsScene
上有 QGraphicsItems
。我需要将它们分组。分组的主要原因:我需要提供一种在组上应用转换的方法。
如果我需要应用单个转换,一切都非常简单,左上角的项目边界矩形位于 0,0。
我已经了解了分组和取消分组的工作原理,保留项目相对于场景的变换,这很棒。但是在分组时,无论我的项目在什么位置,组的坐标都是 (0,0)。
当我尝试任何变换时,无论我对变换原点尝试了什么,项目都会移动。
要显示的简单程序:
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QGraphicsScene s;
QGraphicsView view(&s);
s.setSceneRect(90, -10, 420, 140);
view.show();
QGraphicsRectItem* sceneR = new QGraphicsRectItem(s.sceneRect());
s.addItem(sceneR);
QTransform t; // simple scaling transform
t.scale(2, 1); // adding rotation scares me
QGraphicsRectItem* r0 = new QGraphicsRectItem(QRectF(0, 0, 150, 100)); // for compare, not scaled
r0->setBrush(QBrush(Qt::red));
r0->setPos(100, 0);
s.addItem(r0);
QGraphicsRectItem* r1 = new QGraphicsRectItem(QRectF(0, 0, 150, 100)); // for compare, not scaled
r1->setBrush(QBrush(Qt::blue));
r1->setPos(100, 10);
s.addItem(r1);
QGraphicsRectItem* r2 = new QGraphicsRectItem(QRectF(0, 0, 150, 100)); // will make a group of a single item
r2->setFlags(QGraphicsItem::ItemIsSelectable);
r2->setBrush(QBrush(Qt::green));
r2->setPos(100, 20);
r2->setSelected(true);
s.addItem(r2);
QGraphicsItemGroup* g = s.createItemGroup(s.selectedItems());
// QPointF topLeft = g->mapToScene(g->boundingRect().topLeft());
// g->setTransformOriginPoint(topLeft);
r1->setTransform(t);
g->setTransform(t);
qDebug() << r1->pos() << r1->transform();
qDebug() << g->pos() << g->transform();
return app.exec();
}
如果我应用转换,分组的项目就会移动。我一直没能弄清楚逻辑或如何补偿。
(红色 = 参考,未缩放;蓝色,参考,缩放;绿色,分组和缩放)
在上图中,我希望绿色矩形与蓝色矩形具有相同的 x 坐标(我垂直移动以查看发生了什么)
如何使缩放(和旋转)到位?
(我正在考虑仅设置一个公共父级并执行所有工作以检索项目转换的替代方案,但不确定如何正确组合它们,尤其是缩放组如何找到新位置和新比例内部项目)
找到解决方案 - 尽管我指望小组执行项目转换并计算自己的边,但我也必须手动完成。
步骤:
我找到所选项目的边界矩形(映射到场景)的最左上角 (minX, minY)
,
然后将所有项目移动 -minX, -minY
、
然后分组后,按 minX, minY
.
这设置了正确的转换中心,因此组项目的行为与常规项目一样。它还在其左上角报告一个 pos()
,类似于其他 QGraphicsItems
的默认 pos()
。