拿一棵QGraphicsItems树:一个QGraphicsRectItem,它有两个QGraphicsTextItems作为子级。

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


现在,将QGraphicsScene与两个QGraphicsRectItem放在不同的位置:

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


我现在想要的是CompositeObject是rect1和rect2的子级;我的目标:在同一场景的两个位置上显示QGraphicsItems的相同子树,并由父矩形裁剪。子树上的更新将在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);


还有其他选择吗?

最佳答案

想您可以尝试以下方法:

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
   }
 };


ps该代码不是完整的,也没有经过测试,但是表明了这个想法。

10-07 17:06