2015-10-14 235 views
1

我有QGraphicsItemsQGraphicsScene上。我需要将他们分组。分组的主要原因:我需要提供一种在组上应用转换的方法。QGraphicsItemGroup在转换期间移动

这一切都非常简单,如果我需要应用一个单一的变换,而边界矩形左上角的项目是在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(); 
} 

如果我申请转换,分组项目移动。我一直无法弄清楚逻辑或如何补偿。

enter image description here
(红色=基准,不进行缩放;蓝色,参考,缩放;绿色,分组和缩放)

在图像上方我期望绿色矩形具有相同的x坐标作为蓝色(I垂直移动以查看发生了什么)

如何使我的缩放(和旋转)到位? (我正在考虑设置一个共同的父母,并执行所有的工作来检索项目转换,但不知道如何正确地结合它们,尤其是扩大一个小组如何找到新的位置和新的规模的替代方案内部项目)

回答

1

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

步骤:
我发现所选项目外接矩形的左上角最点(minX, minY)(映射到场景),
然后-minX, -minY通过minX, minY移动的所有项目,
然后分组后,移动组。

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

+0

太棒了!非常感谢。 – FlKo