根据缩放级别渲染QGraphicsScene

时间:2012-09-18 12:31:22

标签: qt zoom qgraphicsview qgraphicsscene

是否有(快速?)方式根据View缩放级别仅渲染GraphicsScene项目的子集?我有一个有很多网格线的大场景,我想隐藏/显示其中一些,当缩放变化时,以避免网格完全填满场景' -effect。

使用GraphicsScene的addLine方法绘制网格线。

P.S。也许,最简单的方法是在其他地方绘制网格(在视图或smth上),因为从逻辑上讲它们不是我场景的一部分,它们只是引导线?但我不知道哪种方式更有效。

3 个答案:

答案 0 :(得分:1)

不建议像这样创建网格,因为你将制作许多会影响场景BSP树的对象,所以它会很快变慢。它也会使你描述的LOD变焦变得更加困难。

我会覆盖QGraphicsView::drawBackground(QPainter* painter, const QRectF& rect),并使用场景坐标中的视图边界来计算您想要的网格线数量以及它们的位置。然后就像正常的绘画操作一样。

您必须将更新模式设置为QGraphicsView::FullViewportUpdate,否则您将在网格渲染中获得伪影。

答案 1 :(得分:1)

对于网格线,我认为最常见的方法是使用QGraphicsScene::drawBackground()方法绘制它们。所以你必须继承QGraphicsScene并重写该方法。这就是我在我的一个应用程序中所做的,它的工作非常好。

我的QGraphicsScene子类中也有一些变量zoomXzoomY。每当视图的比例改变时我都会设置它们。然后在我的drawBackground()方法中,我检查缩放是否合适,如果是,我画线,否则我没有。

答案 2 :(得分:0)

您肯定需要继承库存QGraphicsItem子类(从而放弃addLine()的便利性。)

在QGraphicsLineItem子类的paint()方法中,您可以尝试将线坐标转换为视图的坐标系(使用QPainter实例中的转换paint() )。然后你可以估计线的物理长度(物理如下:视图中的像素长度),如果线太短,则中止绘画。

请注意,进行如此多的坐标计算可能会使一切变得非常缓慢。

编辑:更好的方法是实现一个全新的QGraphicsItem,它一次绘制网格。与维护数百个订单项相比,这在QGraphicsScene级别上节省了相当多的开销。