题
拿一棵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该代码不是完整的,也没有经过测试,但是表明了这个想法。