PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu QPainter



tuxipuxi
11-05-2003, 17:04
Hallo,


als ich heute mal in meinem Qt-Buch was ueber QPainter nachgelesen hab und auch noch in der Qt Referenz geguckt hat, war ich etwas verwundert.

Dort stand, dass in 99% der Faelle der Benutzung von QPainter man die operationen in
der funktion paintEvent() ausfuehren laesst... .

ist das nicht eigentlich vollkommen umstaendlich?
ich meine, wenn man z.b. signals und slots benutzt in einem Programm wo auch QPainter vorkommt, dann waere es doch sinnvoll in einer slot methode zu zeichnen, wie soll denn paintEvent() das ersetzen?


habe ich ein brett vorm kopf oder ist das wirklich ne beschissene loesung mit paintEvent()?


Gruss, tuxipuxi.

axeljaeger
11-05-2003, 17:17
Nein, der Slot sollte nur die Methode update() aufrufen. Alles zeichnen sollte in paintEvent erledigt werden, weil die Methode auch vom WindowSystem aufgerufen wird, wenn das Widget neu gemalt werden muss, bspw. wenn es verdeckt wurde und jetzt wieder zu sehen ist, oder wenn es aus der Taskleiste zurück auf den Bildschirm geholt wurde.

tuxipuxi
11-05-2003, 17:19
ein beispiel(primitiv):

3 buttons, "rot" "gruen ""blau" .. dann waere es doch logisch das man in den slots zu den click signals zeichnet.. wieso ne riesige paintEvent() methode die evt. sogar noch werte abfragen muesste die in slots mit z.b.:

rot = 1;

festgelegt wurden.

axeljaeger
11-05-2003, 17:22
Also, du willst drei Buttons haben, mit denen du zwischen rot, grün und blau umschalten kannst. Du wirst irgendeine Variable umwerfen müssen, weil jedes mal, wenn das Widget neu gezeichnet werden muss, der Inhalt neu mit blau, grün oder rot gefüllt werden müsste. Also sagst du nur farbe = rot und dann neuzeichnen

tuxipuxi
11-05-2003, 17:24
exakt das meine ich!

bei sowas ist es ja einfach, aber man denke an z.b. ein simpled spiel, wo es viele moeglichkeiten gibt.. kugel zeichnen, dreieck zeichen, bereich loeschen... man hat am ende im programm eine gigantische anzahl von variablen.. fuer ALLES ... x werte, y werte , farben... da hast du gut und gerne 50 werte, das darf doch nicht sein, das passt doch garnicht zu Qt.

axeljaeger
11-05-2003, 17:28
Nun, für Spiele gibt es entweder SDL oder QCanvas. Aber bei Spielen ist es im allgemeinen üblich, das Fenster so oft wie nur irgendmöglich neu zu zeichnen. Du wirst nicht hundert x- und y-werte haben, sondern eine Spriteklasse, von der alles erbt, was gezeichnet werden kann, wo es Membervariablen für die Position gibt. Die wirst du in irgendeiner Art von Collection, etwa einer double-linked list unterbringen und sie dann schön mit einer Schleife alle nacheinander zeichnen können

anda_skoa
11-05-2003, 19:45
Du kannst natürlich in den Slots in einen QPixmap Puffer zeichnen und in paintEvent immer nur diesen Puffer in den Painter zeichnen.

Braucht aber mehr Speicher und du musst im resizeEvent deinen Puffer anpassen.

Ciao,
_