2011-03-09 31 views
3

問題表現出一定的QGraphicsItems樹一個的QGraphicsView

採取QGraphicsItems有一定的樹:有兩個QGraphicsTextItems爲孩子QGraphicsRectItem。

QGraphicsRectItem CompositeObject; 
QGraphicsTextItem text1; 
QGraphicsTextItem text2; 
text1.setParent(CompositeObject); 
text2.setParent(CompositeObject); 

現在採取不同的位置有兩個QGraphicsRectItem一個QGraphicsScene:

QgraphicsScene scene; 
QGraphicsRectItem* rect1 = scene.addRect(...); 
QGraphicsRectItem* rect2 = scene.addRect(...); 
rect1.setPos(0,0); 
rect2.setPos(0,100); 

我現在想的是CompositeObject是Rect1的和RECT2的子女;我的目標是:在同一場景中的兩個地方顯示QGraphicsItems的相同子樹,並由父rect剪切。子樹上的更新將在QGraphicsView中的兩個地方可見,而無需任何手動同步等。

解決這我不肯定

我能想到的關於如何做到這一點的唯一事情是:通過使用proxywidget嵌入在場景二QGraphicsViews。我希望在我的場景中複製的子樹將成爲另一個場景(subScene),並且我的主場景中的兩個QGraphicsViews都將顯示subScene。這可能會做到這一點,但由於proxywidget引入了很好的開銷,因爲subScene中的項目必須定期進行動畫和更新,這是我無法承受的。

QGraphicsScene subScene; 
QGraphicsTextItem text1; 
QGraphicsTextItem text2; 
subScene.addItem(text1); 
subScene.addItem(text2); 

QgraphicsScene scene; 
QgraphicsView view1(&subScene); 
QgraphicsView view2(&subScene); 
QGraphicsProxyWidget* proxy1 = scene.addWidget(&view1); 
proxy1.setPos(0,0); 
QGraphicsProxyWidget* proxy2 = scene.addWidget(&view2); 
proxy2.setPos(0,100); 

是否有任何其他選項關於如何做到這一點?

回答

1

認爲你可以試試這個:

class QGraphicsProxyItem 
    : public QGraphicsItem 
{ 
    QGraphicsItem* m_item; 

public: 
    QGraphicsProxyItem(QGrahicsItem* item, QGraphicsItem* parent = 0) 
    : QGraphicsItem(parent) 
    , m_item(item) 
    {} 

    virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0) 
    { 
     m_item->paint(painter,option,widget); 
     // also recurcevly draw all child items 
    } 
}; 

附:該代碼不完整,未經測試,但它顯示了這個想法。

+0

我不認爲這會奏效。首先,兒童物品被塗在父母的油漆之外()。並且代理項目的本地座標仍將映射到其自己的位置。你基本上在相同的地點兩次繪製相同的東西。那就是如果它沒有被修剪過的話。 – 2011-03-09 23:02:00

4

您有正確的想法在1場景中使用2個視圖。但將QGraphicsViews嵌入場景中可能會有問題。

我的建議是,如果您不關心用戶直接與項目交互,請使用2個自定義QGraphicsItems來保存包含要鏡像的項目的相同QGraphicsScene。在2項中的paint()中,使用QGraphicsScene::render()創建圖像並繪製它。

相關問題