4

でグリッドを に描画しましたqgraphicsscene。カスタムをグリッド内のブロックとしてシーンにQLineF追加できます。qgraphicsitems異なる間隔とインデックス (インデックスは太い線です) でグリッドを再描画できるようにしたいと考えています。

私の問題は、行を削除する方法がわからないことです。シーンからすべてを削除することはできますが、すべてのカスタム アイテムを配列にコピーしてからシーンに再度追加する必要があるため、手間がかかりすぎます。行へのポインターのリストを作成しようとしましたが、ポインターを削除できません。行を子として に追加し、qgraphicsitemそのアイテムを削除すると、すべての行が削除されることも考えましたが、行に親を設定することはできません。

から特定のライン コンポーネントを削除するにはどうすればよい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);
    }
}

...動作するはずです。

もう 1 つの方法は、Grid と呼ばれる別の QGraphicsItem を追加し、QGraphicsLineItem ctor で親を設定して、すべての QLineFs をその項目に割り当てることです。

于 2013-03-15T09:39:26.510 に答える