我正在开发一个使用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的值。那将是一个非常蹩脚和丑陋的解决方案。
答案 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。