QGraphicsView 细节处理级别

End*_*dre 1 qt qt4 pyqt4

我正在开发一个使用 QGraphicsView 和 QGraphicsScene (Qt4.8,PyQt)的可视化软件。我需要根据缩放级别进行 LOD(细节级别)处理。为此,我创建了更多 QGraphicsScene,并使用不同的 LOD 级别将整个场景渲染到每个 QGraphicsScene 中。(每个 LOD 级别都有一个 QGraphicsScene)。我根据缩放级别在这些 QGraphicsScene 之间切换。(QGraphicsView.setScene())。最大的问题是,当调用 setScene() 时,QGraphicsView 的 ScrollBar 会重置其位置。

这是一个尝试恢复 ScrollBars 值的代码片段,但它不起作用:

        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)
Run Code Online (Sandbox Code Playgroud)

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

Fab*_*bio 5

我建议使用单个场景来管理不同级别的细节。您可以直接在方法内获取当前的详细程度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
}
Run Code Online (Sandbox Code Playgroud)

Python

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

请参阅QStyleOptionGraphicsItem::levelOfDetailFromTransform(对于 pyqt4 QStyleOptionGraphicsItem.levelOfDetailFromTransform

对于大型场景,有很多项目,请考虑对项目进行分组。您可以在场景变换(或视图变换)更改时检查细节级别并显示/隐藏项目组。请参阅QGraphicsItemGroup