QGraphicsView上的图层?

Ang*_*uck 5 c++ qt qgraphicsview

嗨,我正在创建一个从WFS中提取数据的应用程序,然后QGraphicsView在窗口小部件上显示这些数据层.目前所有图层都被渲染并添加到同一视图中,这意味着如果我想要转换它的一层,则意味着重新渲染除该图层之外的所有图层.

目前我添加了一个添加了QGraphicsSceneEllipse Items和Polygon Items的图形场景.我想知道是否有可能将多个场景添加到图形视图或图层到一个场景或某些东西,这将允许我隐藏/显示复选框中的某些点/多边形或简单隐藏图层的东西?

我知道这有点模糊,但我会感激任何帮助.

谢谢.

The*_*ght 7

你只需要一个QGraphicsScene,但这里的关键是所有QGraphicsItems和QGraphicsObjects都可以成为父级.

如果您创建单个对象QGraphicsItemQGraphicsObject作为父对象,则不需要绘制任何内容,但可以将其用作图层项的根.

因此,子类QGraphicsItem来创建一个QGraphicsItemLayer不呈现任何东西的类,并添加与其子元素在同一层中所需的所有椭圆,多边形等QGraphicsItemLayer.

当您想要隐藏图层时,只需隐藏父QGraphicsItemLayer对象,它的所有子对象也将被隐藏.

--------编辑--------------

继承自QGraphicsItem: -

class QGraphicsItemLayer : public QGraphicsItem
{
    public:
        virtual QRectF boundingRect()
        {
            return QRectF(0,0,0,0);
        }

        virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *)
        {
        }
};
Run Code Online (Sandbox Code Playgroud)

创建图层项:

QGraphicsItemLayer* pLayer = new QGraphicsItemLayer;
Run Code Online (Sandbox Code Playgroud)

将所需对象添加到图层,请注意pLayer作为父对象传递

QGraphicsEllipseItem = new QGraphicsEllipseItem(pLayer);
Run Code Online (Sandbox Code Playgroud)

假设你创建了QGraphicsScene一个带有指向它的指针pScene: -

pScene->addItem(pLayer);
Run Code Online (Sandbox Code Playgroud)

然后当你想隐藏图层时

pLayer->hide();
Run Code Online (Sandbox Code Playgroud)

或显示图层: -

pLayer->show();
Run Code Online (Sandbox Code Playgroud)

  • 为什么这个答案收到了一个downvote?它很好地回答了这个问题.AngryDuck,只是子类QGraphicsItem并提供`boundingRect()`和`paint()`的空实现. (2认同)

evi*_*uff 6

另一种方法是 QGraphicsItemGroup

就像是:

// Group all selected items together
QGraphicsItemGroup *group = scene->createItemGroup(scene->selecteditems());
...
// Destroy the group, and delete the group item
scene->destroyItemGroup(group);
Run Code Online (Sandbox Code Playgroud)

因此,您可以将组视为一个图层,因为组也QGraphicsItem具有show()/ hide()等所有功能.

更新:更改组的Z-val将允许您实现"将图层移动到顶部/底部"之类的内容