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
Problem in paintEvent
vielleicht hilft dir das: http://doc.trolltech.com/4.2/qpaintevent.html
Ansonsten kannst du noch mittels setClipRect(), setClipRegion() oder setClipPath() die Clipregion angeben, also den Bereich in dem du zeichnen kannst.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.
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
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