我已经使用qgraphicsscene
在QLineF
中绘制了一个网格,您可以将自定义qgraphicsitems
作为网格中的块添加到场景中。我希望能够以不同的间距和索引重绘网格(索引只是粗线)。
我的问题是我不知道如何删除这些行。我可以从场景中删除所有内容,但这需要太多工作,因为我必须将所有自定义项目复制到一个数组中,然后将它们重新添加到场景中。我尝试制作一个指向行的指针列表,但我无法删除指针。我还想过将这些行作为子项添加到qgraphicsitem
并删除该项会导致删除所有行,但不能将父项设置为行。
如何从QGraphicsScene
?
像这样:scene->removeItem(..pointer..);
我错误地将scene->addItem(..)
的结果作为对象捕获,然后存储它的& reference。当我将结果存储为指针时,我能够再次操作该项目。
答案 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分配给该项目。