2015-10-14 46 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