QGraphicsView上的图层

Layers on QGraphicsView?

本文关键字:图层 QGraphicsView      更新时间:2023-10-16

嗨,我正在制作一个应用程序,从WFS提取数据,然后在小部件的QGraphicsView上显示这些数据层。目前,所有层都被渲染并添加到同一视图中,这意味着如果我想翻转其中的一层,就意味着重新渲染除该层之外的所有层。

目前,我正在将添加了椭圆项和多边形项的QGraphicsScene添加到图形场景中。我想知道是否可以将多个场景添加到图形视图或将层添加到场景,或者允许我从复选框中隐藏/显示某些点/多边形,或者只隐藏层的东西?

我知道这有点含糊,但我很感激任何帮助。

谢谢。

您只需要一个QGraphicsScene,但这里的关键是所有QGraphicsItemQGraphicsObject都可以成为父级。

如果创建单个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 *)
        {
        }
};

创建图层项目:

QGraphicsItemLayer* pLayer = new QGraphicsItemLayer;

将您想要的对象添加到层中,注意pLayer是作为父传递的

QGraphicsEllipseItem = new QGraphicsEllipseItem(pLayer);

假设您创建了一个名为pScene的指向QGraphicsScene的指针:-

pScene->addItem(pLayer);

然后当你想隐藏层

pLayer->hide();

或者显示图层:-

pLayer->show();

另一种方法是QGraphicsItemGroup

类似于:

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

因此,您可以将组视为一个层,并且由于组也是QGraphicsItem,因此具有show()/hide()等所有功能。

更新:更改组的Z-val将允许您实现诸如"将层移动到顶部/底部"

之类的功能

我认为您可以尝试根据z值对对象进行分区:请参阅setZValue。然后引入层id和索引之间的映射。一个简单的QStringList就可以了。

当然,实际解决方案需要考虑许多细节和变化。