2016-09-26 5 views
0

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.

Antwort

3

Ich schlage vor, eine einzelne Szene zu verwenden, um verschiedene Ebenen von Details zu verwalten. Sie können die aktuelle Detailstufe direkt innerhalb der QGraphicsItem::paint-Methode abrufen und den Artikel entsprechend zeichnen.

Beispiel 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 

Siehe QStyleOptionGraphicsItem::levelOfDetailFromTransform (für PyQt4 QStyleOptionGraphicsItem.levelOfDetailFromTransform)

Für große Szene, mit einer Menge von Elementen, zum Gruppieren von Elementen in Betracht ziehen. Sie können die Detailebene überprüfen, wenn sich die Szenentransformation (oder die Ansichtstransformation) ändert und die Objektgruppe ein-/ausblenden. Siehe QGraphicsItemGroup.

+0

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

+0

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

+0

Gruppierung scheint eine gute Idee zu sein. Ich werde danach suchen. Vielen Dank! – Endre

Verwandte Themen