Показывать определенное дерево QGraphicsItems несколько раз в QGraphicsView - PullRequest
3 голосов
/ 09 марта 2011

Вопрос

Возьмите определенное дерево 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 AND rect2; Моя цель: показать одно и то же поддерево QGraphicsItems в двух местах одной сцены, обрезанное родительским прямоугольником. Обновления в поддереве будут видны в двух местах в QGraphicsView без какой-либо ручной синхронизации или чего-либо подобного.

Решение, в котором я не уверен

Единственное, о чем я могу думать о том, как это сделать, - это встраивание двух QGraphicsViews в сцену с использованием прокси-виджета. Поддерево, которое я хочу видеть дублированным в моей сцене, будет другой отдельной сценой (subScene), и оба QGraphicsViews в моей основной сцене будут отображать 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);

Есть ли другие варианты, как это сделать?

Ответы [ 2 ]

4 голосов
/ 10 марта 2011

У вас есть правильная идея использовать 2 вида на 1 сцену.Но встраивание QGraphicsViews в сцену может быть проблематичным.

Я предлагаю, если вы не заботитесь о взаимодействии пользователя непосредственно с элементами, использовать 2 пользовательских QGraphicsItems для хранения того же QGraphicsSceneкоторый содержит элементы для зеркального отображения.В paint() из 2 элементов используйте QGraphicsScene::render(), чтобы создать изображение и нарисовать его.

1 голос
/ 10 марта 2011

Думаю, вы можете попробовать это:

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

p.s. Этот код не завершен и не проверен, но он показывает идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...