Resize eines QVBoxLayouts
Verfasst: 28. Mai 2009 14:14
Hallo,
ich habe ein Fenster (bzw. ein DockWidget), das aus einem Hauptwidget und einem dazugehörigen horizintalen QScrollBar besteht. die beiden sind per QVBoxLayout in das Fenster eingebunden.
Das Hauptwidget besteht aus einem (matplotlib)-Diagramm und benötigt zum Neuzeichnen immer einige Millisekunden.
Wenn ich jetzt die Fenstergröße ändere, erscheint der Scrollbalken nicht immer korrekt: er wird entweder an der falschen Stelle gezeichnet (bei Änderung der Fensterhöhe), oder hat die falsche Größe (bei Änderung der Fensterbreite). Teilweise liegt er komplett außerhalb des Fensters und ist damit unbedienbar.
Ich habe mal die resizeEvent()- bzw. moveEvent()-Funktionen des Hauptwidgets und der Scrollbar überschrieben, um zu sehen, was da passiert. Offensichtlich kommen die Events in der falschen Reihenfolge:
(hier für eine Änderung der Fensterbreite):
Ich interpretiere das so:
Viele Grüße
olebole
ich habe ein Fenster (bzw. ein DockWidget), das aus einem Hauptwidget und einem dazugehörigen horizintalen QScrollBar besteht. die beiden sind per QVBoxLayout in das Fenster eingebunden.
Das Hauptwidget besteht aus einem (matplotlib)-Diagramm und benötigt zum Neuzeichnen immer einige Millisekunden.
Wenn ich jetzt die Fenstergröße ändere, erscheint der Scrollbalken nicht immer korrekt: er wird entweder an der falschen Stelle gezeichnet (bei Änderung der Fensterhöhe), oder hat die falsche Größe (bei Änderung der Fensterbreite). Teilweise liegt er komplett außerhalb des Fensters und ist damit unbedienbar.
Ich habe mal die resizeEvent()- bzw. moveEvent()-Funktionen des Hauptwidgets und der Scrollbar überschrieben, um zu sehen, was da passiert. Offensichtlich kommen die Events in der falschen Reihenfolge:
(hier für eine Änderung der Fensterbreite):
Code: Alles auswählen
figure resize to QSize(803, 474) <-- erstes Event
figure resize to QSize(879, 474) <-- zweites Event
scroll resize to QSize(879, 15) <-- zweites Event (falsch!!)
scroll resize to QSize(803, 15) <-- erstes Event
- das Hauptwidget erhält das erste Event und zeichnet sich selbst neu (*). Das dauert einige Zeit.
- in dieser Zeit kommt das zweite Resize-Event.
- weil das Widget bereits in einem Zeichen-Prozess ist, wird der zweite Request ignoriert (oder in eine Warteschlange gesetzt) und wird unmittelbar beendet.
- das führt zur Verarbeitung des zweiten Events in der Scrollbar
- nachdem das erste Neuzeichnen beendet ist, beginnt die Verarbeitung des ersten Events in der Scrollbar.
- Qt, weil es die Events nicht in der korrekten Reihenfolge liefert?
- FigureCanvas (bzw. matplotlib), weil es die Verarbeitung des zweiten Events beendet, während das erste noch verarbeitet wird?
- oder ich, weil ich irgendwas nicht verstanden habe?
Viele Grüße
olebole