0

我正在创建一个用户需要使用 QGraphicsView 进行交互的 GUI。所以我现在正在做的是,我创建了 QGraphicsScene 并将其分配给 QGraphicsView。

绘图应该有两层:一层是静态的,一层是动态的。

静态层应该具有在启动时创建一次的对象,而动态层包含多个项目(可能是数百个)并且用户将与动态层对象进行交互。

目前我在同一个场景上绘制两个图层,这会由于绘制大量对象而产生一些滞后。

所以问题:有没有办法将两个或更多 QGraphicsScene 分配给 QGraphicsView ?

4

1 回答 1

0

一种选择可能是实现您自己的派生类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();

我只进行了基本测试,但它的表现似乎符合预期。但不确定任何潜在的性能问题。

于 2020-03-20T12:15:07.097 回答