Seite 1 von 1

[gelöst] QGraphicsView/QGraphicsView update/repaint

Verfasst: 12. April 2010 13:38
von mathies
Hallo,

ich habe ein View/Scene System wo ich relativ große Bilddateien anzeigen lasse. Wenn ich nun zoome und die Scene verschiebe, kommt es sehr oft vor, dass Bereiche nicht aktualisiert werden (bleiben weiß oder es sind alte Bildfragmente enthalten). Dieser Zustand bleibt so lange erhalten bis ich auf eine andere Anwendung oder auf den Windows-Desktop klicke. Dann wird auf einmal alles korrigiert und korrekt dargestellt.

Meine Frage ist, welche Funktion Qt dann aufruft, dann würde ich das nämlich selbst tun. Habe es mit update() und repaint() im QGraphicsView probiert, da tut sich aber gar nix :(

Danke.

Edit:
Ich habe gerade bemerkt, dass ab einer gewissen Zoomstufe mein manuelles repaint() einfach ignoriert wird. Dadurch wird auch nix aktuallisiert. Erst wenn ich woanders hinklicke (also ein anderes Fenster wähle oder den Windows Hintergrund) bekomme ich das paintEvent. Hat jemand eine Idee warum das so ist?

Verfasst: 12. April 2010 15:05
von upsala
Ich gehe davon aus, daß du deine Items selbst erstellt hast und die Dimensionen deiner Items falsch zurückgibst.

Verfasst: 12. April 2010 15:15
von mathies
Hallo,

im Moment gibt es noch gar keine Items. Es wird lediglich der Hintergrund gefüllt.

Zum Testen rufe ich im View einfach bei jedem MouseReleaseEvent() die repaint() Funktion auf und bin davon ausgegangen, dass dann die paintEvent(QPaintEvent* event) Funktion, die ich auch selbst implementiert habe, aufgerufen wird. Dies ist aber nicht der Fall ab einer gewissen Zoomstufe :?:

Diese banale Sache muss doch eigentlich funktionieren, oder? Tut es aber nur bis zu einer gewissen Zoomstufe. Danach wird das paintEvent() nur aufgerufen wenn man den Fokus auf eine andere Anwendung lenkt :(

Verfasst: 12. April 2010 15:40
von mathies
Ok,

hab meinen Fehler gefunden. Warum auch immer hat das Update über die ganze Scene nicht geklappt:

Code: Alles auswählen

scene->update( scene->sceneRect() );
Bei mir funktioniert jetzt:

Code: Alles auswählen

scene->update();
Grüße