2012-09-18 38 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()方法中,我检查缩放是否合适,如果是这样,我画线,否则我不画。