QGraphicsView上的图层?

时间:2013-08-06 08:06:48

标签: c++ qt qgraphicsview

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

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

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

感谢。

3 个答案:

答案 0 :(得分:7)

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

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

因此,QGraphicsItem的子类创建一个不呈现任何内容的QGraphicsItemLayer类,并添加与{{1}的子元素在同一层中所需的所有省略号,多边形等}。

如果要隐藏图层,只需隐藏父QGraphicsItemLayer对象,其所有子图也将被隐藏。

--------已编辑--------------

继承自QGraphicsItemLayer: -

QGraphicsItem

创建图层项目:

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

        virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *)
        {
        }
};

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

传递
QGraphicsItemLayer* pLayer = new QGraphicsItemLayer;

假设您已使用指向QGraphicsEllipseItem = new QGraphicsEllipseItem(pLayer); 的指针创建了QGraphicsScene: -

pScene

然后当你想要隐藏图层

pScene->addItem(pLayer);

或显示图层: -

pLayer->hide();

答案 1 :(得分:5)

另一种方法是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将允许您实现“将图层移动到顶部/底部”等内容

答案 2 :(得分:2)

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

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