我正在开发一个使用 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 的值。这将是一个非常蹩脚和丑陋的解决方案。
我建议使用单个场景来管理不同级别的细节。您可以直接在方法内获取当前的详细程度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。
| 归档时间: |
|
| 查看次数: |
1547 次 |
| 最近记录: |