2016-09-26 164 views
0

我正在使用QGraphicsView和QGraphicsScene(Qt4.8,PyQt)的可视化SW。我需要根据缩放级别处理LOD(详细程度)。为此,我创建了更多QGraphicsScenes,并将整个场景呈现给每个具有不同LOD级别的场景。 (每个LOD级别都有一个QGraphicsScene)。 根据缩放级别,我在这些QGraphicsScenes之间切换。 (QGraphicsView.setScene())。 最大的问题是当调用setScene()时,QGraphicsView的ScrollBars重置它们的位置。QGraphicsView详细处理级别

下面的代码片段它试图恢复滚动条的值,但它不工作:

 hsb = self.horizontalScrollBar() 
     vsb = self.verticalScrollBar() 
     hv, vv = hsb.value(), vsb.value() 
     self.lod = i 
     self.setScene(self.scenes[self.lod]) 
     hsb.setValue(hv) # this simply doesn't work !!!! 
     vsb.setValue(vv) 

任何想法,以保持滚动条的位置?或者有效的检测点处理的想法? 我可以尝试将ScrollBar的值更改信号连接到一些自定义插槽,这些自定义插槽将从自己的信号断开连接,而不是从保存的ScrollBar的值中重新设置值。这将是一个非常蹩脚和丑陋的解决方案。

回答

3

我建议使用单个场景来管理不同级别的细节。 您可以直接在QGraphicsItem::paint方法中获取当前详细程度,并相应地绘制该项目。

例C++:

void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    qreal levelOfDetail = QStyleOptionGraphicsItem::levelOfDetailFromTransform(painter->worldTransform()); 
    //draw the item depending on the level of detail 
} 

的Python

def paint(self, painter, option, widget): 
    levelOfDetail = QStyleOptionGraphicsItem.optionlevelOfDetailFromTransform(painter.worldTransform()) 
    #draw the item depending on the level of detail 

参见QStyleOptionGraphicsItem::levelOfDetailFromTransform(对于PyQt4的QStyleOptionGraphicsItem.levelOfDetailFromTransform

对于大的场景,有很多的项目的,考虑到组项目。当场景变换(或视图变换)更改并显示/隐藏项目组时,您可以检查细节的级别。见QGraphicsItemGroup

+0

您好!我还读到了这种解决方案。但是,如果您有大约100100个图形项目,并且您只想显示100个图形,那么对每100000个图形项目进行决策并不会显示效率很低。没有更好的解决方案吗? – Endre

+0

也许你可以将项目分组?或者创建一种层次结构?您可以在datail更改级别时显示/隐藏一组项目(您可以在场景(或视图)转换更改时检查datail的级别)。 – Fabio

+0

分组似乎是个好主意。我会寻找的。谢谢! – Endre