2

是否有(快速?)根据视图缩放级别仅渲染 GraphicsScene 项目子集的方法?我有一个有许多网格线的大场景,我想隐藏/显示其中一些,当缩放改变以避免“网格完全填充场景”效果时。

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

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

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 并覆盖该方法。这就是我在我的一个应用程序中所做的,它运行得非常好。

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

于 2012-09-18T13:50:08.210 回答
0

您肯定需要对股票 QGraphicsItem 子类进行子类化(从而放弃 的便利性addLine())。

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

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

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

于 2012-09-18T13:44:35.053 回答