Ich arbeite an einer Visualisierungssoftware, die QGraphicsView und QGraphicsScene (Qt4.8, PyQt) verwendet. Ich brauche LOD (level of detail), je nach Zoomstufe. Dazu erstelle ich mehr QGraphicsScenes und rende die ganze Szene mit jeweils unterschiedlichen LOD Levels. (Es gibt eine QGraphicsScene für jede LOD-Ebene). Ich wechsle zwischen diesen QGraphicsScenes abhängig von der Zoomstufe. (QGraphicsView.setScene()). Das große Problem ist, dass die ScrollBars der QGraphicsView ihre Positionen zurücksetzen, wenn setScene() aufgerufen wird.QGraphicsView Ebene der Detailbehandlung
Hier ist ein Code-Schnipsel, die die Scroll Werte wiederherzustellen versucht, aber es funktioniert nicht:
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)
Jede Idee, die Positionen der Bildlaufleisten zu behalten? Oder eine Idee für effizientes LOD-Handling? Ich könnte versuchen, die Wertänderungssignale der ScrollBar in einige benutzerdefinierte Slots zu verbinden, die von ihrem eigenen Signal trennen würden, als den ScrollBar-Wert von einem gespeicherten zu ändern. Das wäre eine sehr lahme und hässliche Lösung.
Hallo! Ich habe auch über diese Art von Lösung gelesen. Aber wenn Sie etwa 100100 Grafikelemente haben und Sie nur 100 anzeigen möchten, ist es ziemlich ineffizient, die Entscheidung für alle 100000 Grafikelemente zu treffen, die nicht angezeigt werden. Gibt es keine bessere Lösung? – Endre
Vielleicht können Sie die Elemente gruppieren? Oder eine Art Hierarchie erstellen? Sie können eine Gruppe von Elementen anzeigen/ausblenden, wenn sich die Datenebene ändert (Sie können die Datenebene überprüfen, wenn sich die Szene (oder die Ansicht) ändert). – Fabio
Gruppierung scheint eine gute Idee zu sein. Ich werde danach suchen. Vielen Dank! – Endre