你好,我正在制作一个应用程序,从WFS中提取数据,然后在小部件上的 QGraphicsView
上显示这些数据层。目前所有图层都被渲染并添加到同一个视图中,这意味着如果我想要关闭一层,则需要重新渲染除该层外的所有内容。
目前我正在向图形场景添加椭圆项和多边形项,以将它们添加到图形场景中。我想知道是否可能向图形视图添加多个场景或向场景添加图层,或者其他一些方法,使我能够仅通过复选框等隐藏/显示特定点/多边形,或者只是简单地隐藏一个图层?
我知道这有点模糊,但我会感激任何帮助。
谢谢。
你好,我正在制作一个应用程序,从WFS中提取数据,然后在小部件上的 QGraphicsView
上显示这些数据层。目前所有图层都被渲染并添加到同一个视图中,这意味着如果我想要关闭一层,则需要重新渲染除该层外的所有内容。
目前我正在向图形场景添加椭圆项和多边形项,以将它们添加到图形场景中。我想知道是否可能向图形视图添加多个场景或向场景添加图层,或者其他一些方法,使我能够仅通过复选框等隐藏/显示特定点/多边形,或者只是简单地隐藏一个图层?
我知道这有点模糊,但我会感激任何帮助。
谢谢。
只需要一个QGraphicsScene
对象,而关键在于所有的QGraphicsItem
和QGraphicsObject
都可以被父级化。
如果您创建一个单独的QGraphicsItem
或QGraphicsObject
作为父级对象,则无需绘制任何内容,但可以用作层中项目的根。
因此,从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
,因此具有显示()/隐藏()等所有功能。
更新:更改组的Z值将允许您实现诸如“将图层移到顶部/底部”之类的操作。
group->show
和 group->hide
来在图形视图中显示/隐藏多边形/点,效果很好,而且没有不必要的代码量。 - AngryDuck
boundingRect()
和paint()
的空实现即可。 - Stefan Majewsky