QGraphicsView 细节处理层次
QGraphicsView level of detail handling
我正在开发使用 QGraphicsView 和 QGraphicsScene(Qt4.8、PyQt)的可视化软件。我需要根据缩放级别处理 LOD(细节级别)。为此,我创建了更多 QGraphicsScenes,并将整个场景渲染到每个具有不同 LOD 级别的场景。 (每个 LOD 级别都有一个 QGraphicsScene)。
我根据缩放级别在这些 QGraphicsScenes 之间切换。 (QGraphicsView.setScene())。
最大的问题是 QGraphicsView 的滚动条在调用 setScene() 时重置它们的位置。
这是一个尝试恢复 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)
有保留滚动条位置的想法吗?或者有什么关于高效 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
}
Python
def paint(self, painter, option, widget):
levelOfDetail = QStyleOptionGraphicsItem.optionlevelOfDetailFromTransform(painter.worldTransform())
#draw the item depending on the level of detail
参见 QStyleOptionGraphicsItem::levelOfDetailFromTransform (for pyqt4 QStyleOptionGraphicsItem.levelOfDetailFromTransform )
对于大场景,物品较多,考虑对物品进行分组。您可以在场景变换(或视图变换)更改时检查细节级别和 show/hide 项目组。参见 QGraphicsItemGroup。
我正在开发使用 QGraphicsView 和 QGraphicsScene(Qt4.8、PyQt)的可视化软件。我需要根据缩放级别处理 LOD(细节级别)。为此,我创建了更多 QGraphicsScenes,并将整个场景渲染到每个具有不同 LOD 级别的场景。 (每个 LOD 级别都有一个 QGraphicsScene)。 我根据缩放级别在这些 QGraphicsScenes 之间切换。 (QGraphicsView.setScene())。 最大的问题是 QGraphicsView 的滚动条在调用 setScene() 时重置它们的位置。
这是一个尝试恢复 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)
有保留滚动条位置的想法吗?或者有什么关于高效 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
}
Python
def paint(self, painter, option, widget):
levelOfDetail = QStyleOptionGraphicsItem.optionlevelOfDetailFromTransform(painter.worldTransform())
#draw the item depending on the level of detail
参见 QStyleOptionGraphicsItem::levelOfDetailFromTransform (for pyqt4 QStyleOptionGraphicsItem.levelOfDetailFromTransform )
对于大场景,物品较多,考虑对物品进行分组。您可以在场景变换(或视图变换)更改时检查细节级别和 show/hide 项目组。参见 QGraphicsItemGroup。