7

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

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

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

谢谢。

4

3 回答 3

9

你只需要一个QGraphicsScene,但这里的关键是所有QGraphicsItem的 s 和QGraphicsObjects 都可以是父级。

如果您创建单个QGraphicsItemQGraphicsObject作为父对象,它不需要绘制任何东西,但可以用作图层项目的根。

因此,子类 fromQGraphicsItem以创建一个QGraphicsItemLayer不渲染任何内容的类,并添加与 that 的子级在同一层中所需的所有椭圆、多边形等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);

假设您已经创建了QGraphicsScene一个指向它的指针,称为pScene:-

pScene->addItem(pLayer);

然后当你想隐藏图层时

pLayer->hide();

或显示图层:-

pLayer->show();
于 2013-08-06T08:53:26.847 回答
8

另一种方法是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 将允许您实现诸如“将层移动到顶部/底部”之类的东西

于 2013-08-06T09:58:07.930 回答
2

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

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

于 2013-08-06T09:23:21.367 回答