PyQT4: alte Fenstergröße vor dem paintEvent festhalten

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
schnupp
User
Beiträge: 19
Registriert: Samstag 24. Januar 2009, 17:30
Wohnort: Hamburg

Montag 23. Februar 2009, 16:56

Hallo,

wie hält man geschickt die "alte" Größe eines Fensters fest?

Folgendes passiert: das Fenster wird z.B. per Maus vergrößert und über
def paintEvent(self, event) wird es neu gezeichnet.
Innerhalb des paintEvents bräuchte ich aber die alte Größe um Rechtecke (paint.drawRect), die gezeichnet werden sollen, wieder richtig auszurichten.
Gibt es ein Äquivalent z.B. zu self.width() für die alte Größe?
Oder würde man das ggf. ganz anders machen?

Danke!

Grüße
Frank
vorlautboy
User
Beiträge: 38
Registriert: Sonntag 7. Dezember 2008, 18:43

Montag 23. Februar 2009, 18:31

schau dir mal QWidget.resizeEvent an. QResizeEvent.oldSize gibt die alte größe des widgets zurück.
schnupp
User
Beiträge: 19
Registriert: Samstag 24. Januar 2009, 17:30
Wohnort: Hamburg

Mittwoch 25. Februar 2009, 20:59

Danke!

Ich brauche aber wohl doch noch einmal Hilfe als Anfänger. :roll:
Das Event sieht jetzt z.B. so aus:

Code: Alles auswählen

   def resizeEvent(self, event):
        a = event.oldSize()
        print a


Aber wie könnte ich das an mein
def paintEvent(self, event):
übergeben?

(PyQt4.QtCore.QSize(360, 180) wäre z.B. das Event)

Grüße
Frank
vorlautboy
User
Beiträge: 38
Registriert: Sonntag 7. Dezember 2008, 18:43

Donnerstag 26. Februar 2009, 10:55

schnupp hat geschrieben:Aber wie könnte ich das an mein
def paintEvent(self, event):
übergeben?
evtl. über eine instanzvariable 'self.oldsize' oder theoretisch direkt im resizeEvent zeichnen, allerdings sagt die qt doku dazu
No drawing need be (or should be) done inside this handler.
wozu brauchst du die alte größe denn?
schnupp
User
Beiträge: 19
Registriert: Samstag 24. Januar 2009, 17:30
Wohnort: Hamburg

Donnerstag 26. Februar 2009, 13:29

Ich habe ein SVG-Hintergrundbild, auf das ich kleine Rechtecke legen möchte - quasi als Markierungspunkte, die zudem von Zeit zu Zeit an anderen Stellen sein werden. Wenn ich jetzt die Fenstergröße ändere, verzerrt sich das Hintergrundbild. Die Rechtecke bleiben aber statisch an den festgelegten Positionen und stimmen nicht mehr mit den gewünschten Punkten überein.

Das Problem könnte man jetzt lösen, indem man die Position der Punkte neu berechnet. Und dafür bräuchte ich die alte und neue Fenstergröße.
Ich habe schon überlegt, ob man die Daten nicht einfach jeweils in globale Variablen schreibt, aber sauber ist das auch nicht.

self.oldSize() kennt er leider nicht...

Grüße
Frank
vorlautboy
User
Beiträge: 38
Registriert: Sonntag 7. Dezember 2008, 18:43

Donnerstag 26. Februar 2009, 14:11

schnupp hat geschrieben:self.oldSize() kennt er leider nicht...
ne musst du auch selbst schreiben :)
dein fenster könnte so aussehen:

Code: Alles auswählen

class Widget(QtGui.QWidget):
  def __init__(self, ...):
    QtGui.QWidget.__init__(self, ...)
    self.oldsize = None
  def resizeEvent(self, ev):
    self.oldsize = ev.oldSize()
  def paintEvent(self, ev):
    if self.oldsize:
      ... # hier zeichnen
du behältst die alte größe einfach in der klasse, anstatt eine globale variable zu verwenden und zeichnest nur wenn die variable auch einen Wert hat.

Aber falls möglich würde ich layouts verwenden, die passen die größen automatisch an.
schnupp
User
Beiträge: 19
Registriert: Samstag 24. Januar 2009, 17:30
Wohnort: Hamburg

Donnerstag 26. Februar 2009, 15:18

Aua, warum kompliziert, wenn es self. gibt?! 8)

Das mit den Layouts dürfte jedoch schwierig werden.
drawRect ist ja kein Widget, dass man in ein Layout zwängen könnte, da es von Koordinaten abhängig ist. Aber das kommt später...
:wink:
Antworten