Seite 1 von 1

Bildschirmflickern bei neuzeichnen eines Widgets

Verfasst: 16. August 2006 15:45
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

Verfasst: 16. August 2006 16:27
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?

Verfasst: 16. August 2006 17:06
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?

Verfasst: 17. August 2006 09:09
von Mamba
Keiner eine Idee?

Verfasst: 17. August 2006 09:33
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.