7

こんにちは、WFS からデータを取得し、それらのデータのレイヤーをQGraphicsViewウィジェットに表示するアプリケーションを作成しています。現時点では、すべてのレイヤーがレンダリングされ、同じビューに追加されます。レイヤーを回転させたい場合は、そのレイヤーを除くすべてを再レンダリングすることを意味します。

現時点ではQGraphicsScene、Ellipse Items と Polygon Items が追加された をグラフィックス シーンに追加しています。複数のシーンをグラフィックス ビューに追加したり、レイヤーをシーンに追加したり、チェック ボックスから特定のポイント/ポリゴンを非表示/表示したり、単にレイヤーを非表示にしたりすることができるかどうか疑問に思っています。

私はこれが漠然としていることを知っていますが、助けていただければ幸いです。

ありがとう。

4

3 に答える 3

9

必要なのは 1 つだけですQGraphicsSceneが、ここで重要なのは、すべてQGraphicsItemの と をQGraphicsObject親にすることができるということです。

単一のオブジェクトQGraphicsItemまたはQGraphicsObject親オブジェクトとして作成する場合、何も描画する必要はありませんが、レイヤーのアイテムのルートとして使用できます。

したがって、からサブクラス化して、何もレンダリングしないクラスQGraphicsItemを作成し、その子と同じレイヤーで必要なすべての楕円、多角形などを追加します。QGraphicsItemLayerQGraphicsItemLayer

レイヤーを非表示にする場合は、親QGraphicsItemLayerオブジェクトを非表示にすると、そのすべての子も非表示になります。

-------- 編集 --------------

継承元QGraphicsItem: -

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

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

レイヤー アイテムを作成します。

QGraphicsItemLayer* pLayer = new QGraphicsItemLayer;

レイヤーに必要なオブジェクトを追加します。pLayer が親として渡されることに注意してください。

QGraphicsEllipseItem = new QGraphicsEllipseItem(pLayer);

QGraphicsSceneと呼ばれるポインタを使用して を作成したと仮定しますpScene: -

pScene->addItem(pLayer);

次に、レイヤーを非表示にしたい場合

pLayer->hide();

またはレイヤーを表示します: -

pLayer->show();
于 2013-08-06T08:53:26.847 に答える
2

z値に従ってオブジェクトを分割しようとすることができると思います: setZValueを参照してください。次に、レイヤー ID とインデックス付けの間のマッピングを導入します。単純な QStringList でできます。

もちろん、実用的なソリューションを検討するために必要な詳細やバリエーションは多数あります。

于 2013-08-06T09:23:21.367 に答える