2

ビューのズームレベルに従ってGraphicsSceneアイテムのサブセットのみをレンダリングする(迅速な)方法はありますか?グリッド線がたくさんある大きなシーンがあり、「グリッドがシーンを完全に埋める」効果を回避するためにズームが変更されたときに、それらの一部を非表示/表示したいと思います。

グリッド線は、GraphicsSceneのaddLineメソッドを使用して描画されます。

PSたぶん、最も簡単な方法は、グリッドを別の場所(ビューまたはそのようなsmth)に描画することです。論理的には、グリッドは私のシーンの一部ではなく、ガイドラインにすぎないのでしょうか。しかし、どちらの方法がより効果的かはわかりません。

4

3 に答える 3

1

シーンの BSP ツリーに影響を与える多くのオブジェクトを作成することになるため、そのようなグリッドを作成することはお勧めできません。そのため、すぐに遅くなります。また、あなたが説明したような LOD ズームをより難しくします。

を上書きQGraphicsView::drawBackground(QPainter* painter, const QRectF& rect)し、シーン座標でビューの境界を使用して、必要なグリッド線の数とその位置を計算します。あとは通常の塗装作業と同じように塗装するだけです。

更新モードを に設定するQGraphicsView::FullViewportUpdate必要があります。そうしないと、グリッド レンダリングでアーティファクトが発生します。

于 2012-09-18T13:49:43.587 に答える
1

グリッド線の場合、最も一般的なアプローチはQGraphicsScene::drawBackground()メソッドで描画することだと思います。したがって、QGraphicsScene をサブクラス化し、そのメソッドをオーバーライドする必要があります。それが私のアプリケーションの 1 つで行っていることであり、非常にうまく機能します。

QGraphicsScene サブクラスにもいくつかの変数がzoomXあります。zoomYビューのスケールが変更されるたびに設定します。次に、私のdrawBackground()方法では、ズームが適切かどうかを確認し、適切な場合は線を引き、そうでない場合は描画しません。

于 2012-09-18T13:50:08.210 に答える
0

ストックQGraphicsItemサブクラスをサブクラス化する必要があります(したがって、の利便性を放棄しますaddLine())。

QGraphicsLineItem サブクラスのpaint()メソッドでは、ライン座標をビューの座標系に変換することができます ( にQPainter指定されたインスタンスの変換を使用paint())。次に、線の物理的な長さ (ビュー上のピクセル単位の長さ) を推定し、線が短すぎる場合は描画を中止します。

ただし、非常に多くの座標計算を行うと、すべてが非常に遅くなる可能性があることに注意してください。

編集:より良い方法は、グリッドを一度に描画するまったく新しい QGraphicsItem を実装することです。これにより、何百ものラインアイテムを維持する場合と比較して、QGraphicsScene レベルでかなりのオーバーヘッドが節約されます。

于 2012-09-18T13:44:35.053 に答える