4

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

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

如何从 a 中删除特定的行组件QGraphicsScene

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

4

1 回答 1

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 分配给该项目。

于 2013-03-15T09:39:26.510 回答