Bildschirmflickern bei neuzeichnen eines Widgets

Alles rund um die Programmierung mit Qt
Antworten
Mamba
Beiträge: 17
Registriert: 18. April 2006 11:41

Bildschirmflickern bei neuzeichnen eines Widgets

Beitrag von Mamba »

Hi,

ich habe hier folgendes Problem:
Ich habe ein Widget (genaugenommen ein Frame in einem Widget), auf dem ich ein Pixmap zeichnen will. Dieses Pixmap muss 30 mal die Sekunde neu gezeichnet werden, und wandert quer über den Frame. Dazu habe ich die paintEvent() des Frames überschrieben. In QT4 klappte das zwar ruckelig, aber wurde sauber gezeichnet.
Jetzt musste ich wieder auf QT3 umstellen, und habe nun den Effekt dass das ganze ständig flickert. Ich habe dann herausgefunden, dass das Widget standardmässig gecleared wird vor einem paintEvent().
Gut, kein Problem, das kann man ja abstellen indem man das Qt::WNoAutoErase im Frame setzt. Dann allerdings muss man sich selbst ums übermalen aller Pixel kümmern. Wenn ich nun innerhalb meiner paintEvent() vor dem malen des Pixmaps ein fillRect im Frame mache, um das ganze Ding zu übermalen, flickert es wieder. :shock:

Es ist also so, dass jede Zeichenaktion direkt auf den Bildschirm gebracht wird, und es offensichtlich nicht möglich ist, erst einmal verschiedene Zeichenoperationen durchzuführen ohne diese gleich auf den Monitor zu bringen. Kann man sowas irgendwie unterdrücken? Also dass ich in einem Schritt ein fillRect und ein drawPixmap mache, und dann erst ein Screenupdate? Ich hoffe ihr versteht was ich meine!? Wenn nicht, bitte einfach nachfragen!

Ich entwickel unter Windows XP mit Visual Studio 2003 .NET und QT 3.3.6.

Viele Grüße,
Mamba
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Qt4 verwendet standardmässig DoubleBuffering, deshalb gibts kein Flickern. In Qt3 musst Du das selbst machen (weiss nicht genau - evtl. gibts auch ein WStyle dafür). Also erst in ein QPixmap zeichnen und das dann als ganzes anzeigen. Allerdings sind 30Bilder/Sekunde doch schon recht viel - das sieht doch keiner, oder?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Mamba
Beiträge: 17
Registriert: 18. April 2006 11:41

Beitrag von Mamba »

Ja, genauso hab ichs jetzt gemacht. 30 Bilder waren jetzt auch einfach nur mal eine Zahl. ;)
Also ich mach jetzt ein Pixmap, welches so groß ist wie das Widget, und zeichne in einem ersten Schritt mein bemaltes Pixmap da drauf. Anschließend zeichne ich das resultierende Pixmap auf das Widget. Da es die gleiche Größe wie das Widget hat, klappt das dann.

Irgendwie seltsam umschifft dieses Verhalten. Es muss doch einen Weg geben die 2D-Renderloop selbst zu steuern?
Mamba
Beiträge: 17
Registriert: 18. April 2006 11:41

Beitrag von Mamba »

Keiner eine Idee?
Einmaliger
Beiträge: 48
Registriert: 22. Juli 2006 11:42

Beitrag von Einmaliger »

Ich weiß nicht so ganz, was du an der Vorgehensweise seltsam findest. Double Buffering ist eine Standardtechnik, die man überall einsetzt, wo man genau dieses Flickern verhindern will.
Antworten