从QGraphicsScene中删除单个项目/ QLineF

时间:2012-09-18 16:01:13

标签: qt drawing qgraphicsscene

我已经使用qgraphicssceneQLineF中绘制了一个网格,您可以将自定义qgraphicsitems作为网格中的块添加到场景中。我希望能够以不同的间距和索引重绘网格(索引只是粗线)。

我的问题是我不知道如何删除这些行。我可以从场景中删除所有内容,但这需要太多工作,因为我必须将所有自定义项目复制到一个数组中,然后将它们重新添加到场景中。我尝试制作一个指向行的指针列表,但我无法删除指针。我还想过将这些行作为子项添加到qgraphicsitem并删除该项会导致删除所有行,但不能将父项设置为行。

如何从QGraphicsScene

中删除特定的线条组件

像这样:scene->removeItem(..pointer..);我错误地将scene->addItem(..)的结果作为对象捕获,然后存储它的& reference。当我将结果存储为指针时,我能够再次操作该项目。

1 个答案:

答案 0 :(得分:1)

您可以使用QGraphicsItemGroup - http://qt-project.org/doc/qt-4.8/qgraphicsitemgroup.html,类似于......

void Grid::addVerticalLineAt(qreal xCoord)
{
    QRectF sceneRect = scene()->sceneRect();
    QGraphicsLineItem* line = scene()->addLine(xCoord, mapFromScene(sceneRect.top()), xCoord, mapFromScene(sceneRect.bottom()));
    (QGraphicsItemGroup*)(this->gridLines)->addToGroup(line);
}
void Grid::Refresh(qreal p_Scale)
{
    delete this->gridLines;                     //deletes all lines underneath
    gridLines = new QGraphicsItemGroup(this);   //construct this _before_ you start calling addXXXLineAt
    qreal spacing = BASIC_SPACING * p_Scale;
    for(qreal curXCoord = sceneRect.left(); curXCoord < sceneRect.right(); curXCoord += spacing) //each spaced point in scenerect 
    {
        addVerticalLineAt(curXCoord);
    }
}

......应该有用。

另一种方法是添加另一个名为Grid的QGraphicsItem,并通过在QGraphicsLineItem ctor中设置父项来将所有QLineF分配给该项目。

相关问题