QGraphicsView详细处理级别

时间:2016-09-26 00:51:00

标签: qt qt4 pyqt4

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

以下是尝试恢复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)

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

1 个答案:

答案 0 :(得分: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