【问题标题】:QGraphicsItemGroup moves during transformationsQGraphicsItemGroup 在转换期间移动
【发布时间】:2015-10-14 16:55:04
【问题描述】:

我在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 坐标(我垂直移动以查看发生了什么)

我怎样才能使我的缩放(和旋转)到位?

(我正在考虑仅设置一个公共父级并执行所有工作以检索项目转换的替代方案,但不确定如何正确组合它们,尤其是缩放组如何找到内部的新位置和新比例项目)

【问题讨论】:

    标签: qt grouping transformation qgraphicsitem


    【解决方案1】:

    找到了解决方案 - 即使我指望该组执行项目转换并计算其自身的边缘,我也必须手动完成。

    步骤:
    我找到所选项目的边界矩形(映射到场景)的左上角(minX, minY)
    然后通过-minX, -minY移动所有项目,
    然后分组后,将分组移动minX, minY

    这会设置正确的转换中心,因此组项的行为类似于常规项。它还在左上角报告了一个pos(),类似于其他QGraphicsItems 的默认pos()

    【讨论】:

    • 太棒了!非常感谢。
    猜你喜欢
    • 2021-09-26
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    相关资源
    最近更新 更多