2012-09-18 58 views
2

是否有一種(快速?)方式根據視圖縮放級別僅渲染GraphicsScene項目的子集?我有許多網格線的大場景,我想隱藏/顯示其中的一些,當縮放變化時避免「網格完全填充場景」效果。根據縮放級別渲染QGraphicsScene

網格線是使用GraphicsScene的addLine方法繪製的。

P.S.也許,最簡單的方法是在其他地方繪製網格(在視圖或像這樣的平面),因爲從邏輯上講,它們不是我場景的一部分,它們只是指引線?但我不知道哪種方式更有效。

回答

1

不建議創建這樣的網格,因爲您將製作許多會影響場景BSP樹的對象,因此它會很快變慢。它也會使你的LOD變焦變得更加困難。

我會覆蓋QGraphicsView::drawBackground(QPainter* painter, const QRectF& rect),並在場景座標中使用視圖邊界來計算您想要的網格線數量以及它們的位置。然後就像普通的繪畫操作一樣繪畫。

您必須將更新模式設置爲QGraphicsView::FullViewportUpdate,否則您將在網格渲染中獲得人工產物。

0

您肯定需要繼承庫存QGraphicsItem子類(因此放棄addLine()的便利)。

在QGraphicsLineItem子類的paint()方法,你可以嘗試翻譯線座標轉換成視圖座標系統(使用在給paint()QPainter實例的變換)。然後,您可以估計線條的物理長度(物理長度,視圖中的像素長度),如果線條太短,則會中止繪畫。

儘管如此,許多座標計算可能會使一切都非常緩慢。

編輯:更好的方法可能是實現一次繪製網格的全新的QGraphicsItem。與維護數百個訂單項相比,這在QGraphicsScene級別節省了相當多的開銷。

1

對於網格線我相信最常用的方法是在QGraphicsScene::drawBackground()方法中繪製它們。所以你將不得不繼承QGraphicsScene並覆蓋該方法。這就是我在我的一個應用程序中所做的,它的工作原理非常好。

我的QGraphicsScene子類中還有一些變量zoomXzoomY。只要視圖的比例發生變化,我就會設置它們。然後在我的drawBackground()方法中,我檢查縮放是否合適,如果是這樣,我畫線,否則我不畫。