Problem in paintEvent

Alles rund um die Programmierung mit Qt
Antworten
Tomte
Beiträge: 3
Registriert: 7. Februar 2007 23:24

Problem in paintEvent

Beitrag von Tomte »

Hi Leute,

ich programmiere gerade eine GUI, die eine zoombare Karte beinhaltet. Die Karte ist abgeleitet von Widget und befindet sich in einer ScrollView.

Die Karte selbst zeichne ich in einem paintEvent. Das heisst, der Painter skaliert sich abhängig vom Zoom-Faktoren und zeichnet dann ein Pixmap (beinhaltet die Karte).

Problem ist, dass der ganze Spaß extrem langsam ist. Das Bild zieht nach, wenn man scrolled und befindet man sich im Zoom wird das ganze nur noch schlimmer.
Das alles ist ja eigentlich auch kein Wunder, da das Bild bei jedem Ruf des paintEvents komplett skaliert und neu gemalt wird.

Jetzt frage ich mich, ob ich die Karte wirklich jedes mal neuzeichnen muss? Ich habe schon probiert, die Karte einfach zu skalieren in ein anderes Pixmap zu zeichnen und dann mit setPaletteBackgroundPixmap(...) einfach als Hintergrund zu setzen. Das ist aber auch keine Lösung. Zwar ist das scrollen schön flott, dafür dauert das Zoomen weitaus länger (mein Rechner rödelt wild rum).

Das Widget scheint ja jedesmal von grund auf gemalt zu werden. Ich frage mich, ob es eine Möglichkeit gibt, dem paintEvent mitzuteilen, dass es nicht das ganze Widget neuzeichnen soll. Also quasi das, was der Painter zuletzt gezeichnet hat, erneut zu laden. Sowas gibts doch bestimmt, aber ich finds einfach nicht...

Gruß
Tomte
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Beitrag von dhcase »

vielleicht hilft dir das: http://doc.trolltech.com/4.2/qpaintevent.html
The event contains a region() that needs to be updated, and a rect() that is the bounding rectangle of that region. Both are provided because many widgets can't make much use of region(), and rect() can be much faster than region().boundingRect(). Painting is clipped to region() during the processing of a paint event.
Ansonsten kannst du noch mittels setClipRect(), setClipRegion() oder setClipPath() die Clipregion angeben, also den Bereich in dem du zeichnen kannst.
Tomte
Beiträge: 3
Registriert: 7. Februar 2007 23:24

Beitrag von Tomte »

okay, ich hatte das QPaintEvent wohl nicht ganz richtig verstanden. Es wird also wirklich nur der aktuell sichtbare Bereich bemalt.

Ich denke, ich habe mein Problem lösen können. Die Performance lidt ziemlich übel am neuskalieren des gesamten Bildes. Bevor ich das Bild jetzt zeichne skaliere ich es einmal (in einem anderen Objekt), nachdem ich den Zoom Faktor geändert habe. Jetzt muss ich nur noch das schon skalierte Bild zeichnen und das läuft wesentlich flotter.

Danke für die schnelle Hilfe!!!

Gruß
Tomte
Antworten