Добавление нескольких QGraphicsScene в QGraphicsView - PullRequest
0 голосов
/ 20 марта 2020

Я создаю GUI, где пользователю необходимо взаимодействовать с помощью QGraphicsView. Итак, что я сейчас делаю, я создал QGraphicsScene и назначил его QGraphicsView.

Предполагается наличие двух слоев для рисования: один слой c и один динамический c.

Уровень Stati c должен содержать объекты, которые создаются один раз при запуске. в то время как динамический c слой содержит несколько элементов (может быть, их сотни), и пользователь будет взаимодействовать с динамическими c объектами слоя.

В настоящее время я рисую оба слоя на одной сцене, что создает некоторое отставание из-за большого количества нарисованных объектов.

Итак, вопрос: есть ли способ назначить два или более QGraphicsScene на QGraphicsView?

1 Ответ

0 голосов
/ 20 марта 2020

Один из вариантов может заключаться в реализации вашего собственного класса, производного от QGraphicsScene, который может затем визуализировать вторую 'фоновую' сцену в ее drawBackground переопределении.

class graphics_scene: public QGraphicsScene {
  using super = QGraphicsScene;
public:
  using super::super;
  void set_background_scene (QGraphicsScene *background_scene)
    {
      m_background_scene = background_scene;
    }
protected:
  virtual void drawBackground (QPainter *painter, const QRectF &rect) override
    {
      if (m_background_scene) {
        m_background_scene->render(painter, rect, rect);
      }
    }
private:
  QGraphicsScene *m_background_scene = nullptr;
};

Тогда использовать как ...

QGraphicsView view;

/*
 * fg is the 'dynamic' layer.
 */
graphics_scene fg;

/*
 * bg is the 'static' layer used as a background.
 */
QGraphicsScene bg;
bg.addText("Text Item 1")->setPos(50, 50);
bg.addText("Text Item 2")->setPos(250, 250);
fg.addText("Text Item 3")->setPos(50, 50);
fg.addText("Text Item 4")->setPos(350, 350);
view.setScene(&fg);
fg.set_background_scene(&bg);
view.show();

Я только выполнил базовое c тестирование, но, похоже, оно работает так, как ожидалось. Не уверен насчет возможных проблем с производительностью.

...