QT - QMovie Flacker Effekt

Post Reply
Message
Author
Jens

QT - QMovie Flacker Effekt

#1 Post by Jens »

Hallo,

ich habe ein klaines QT Programm geschrieben, dass mir im Vollbildmodus ein Jpeg als Hintergrund und davor eine Gif Animation zeigt.
Wenn man die Gif Animation nun allerdings ausblendet oder einfach nur auswechselt, gibt es immer unschöne Flackereffekte oder an der Stelle des Bildschirms wo zuvor die Animation war leuchtet nochmal kurz ein graues Kästchen in der Größe des Bildes auf.
Die Anzeige habe ich mittels zweier QLabel Fenster realisiert. Im Hintergrund liegt ein QWidget im Vollbild. Das erste QLabel (Hintergrund) ist child des QWidgets und das zweite QLabel (Animation) wiederum child des ersten QLabels.

BFenster=new QLabel(this);
AFenster=new QLabel(BFenster);

this ist die von QWidget abgeleitete Fensterklasse.

So lade ich den Hintergrund, wobei Background vom Typ QPixmap ist.

Background->load(AKlasse->GetBackground()); // Neuen Background laden,
BFenster->setPixmap(*Background); // ans Fenster binden,
BFenster->resize(Background->width(),Background->height()); // Größe einstellen,
BFenster->move((this->width()-Background->width())/2,(this->height()-Background->height())/2); // und zentrieren.

Und so lade ich die Animation. Da die Klasse QMovie keine load() Funktion besitzt, erzeuge ich das Objekt Animation jedes Mal neu.

delete Animation; // Aktuelle Animation wird gelöscht,
Animation=new QMovie(AKlasse->GetAnimation()); // eine Neue erstellt, über den Konstruktor geladen
Animation->setBackgroundColor(QColor(0,0,0)); // der Hintergrund gesetzt (verhindert flackern),
AFenster->move(AKlasse->GetX(),AKlasse->GetY()); // die Position eingestellt
AFenster->resize(AKlasse->GetWidth(),AKlasse->GetHeight()); // die Größe eingestellt,
AFenster->setMovie(*Animation); // und ans Fenster gebunden.


Um es nochmal auf den Punkt zu bringen. AFenster liegt vor BFenster. Wenn ich AFenster ausblende AFenster->hide() kommt der Effekt, dass kurz ein graues Kästchen zu sehen ist.
Genau diesen Effekt würde ich gerne beseitigen.

Kann mir jemand weiterhelfen?

Vielen Dank im Voraus,

Jens

Dominik Seichter

Re: QT - QMovie Flacker Effekt

#2 Post by Dominik Seichter »

Mir fallen da spontan zwei Möglichkeiten ein:
1. Schau Dir mal die Doku zu QWidget::setUpdatesEnabled( bool ) an. Schalte die updates aus befor Du die alte Animation löschst und wieder an wenn die neue geladen ist. Das sollte das flacken beheben.

2. Die andere Möglichkeit wäre, die neue Animation zu laden bevor, Du die alte löschst. Zum Beispiel so:

Animation2 = new QMovie( gifbild );
delete Animation;
Animation = Animation2;

So in der Art sollte es auch klappen.

CU Dom

Jens

Re: QT - QMovie Flacker Effekt

#3 Post by Jens »

Danke für deine Antwort, aber daran liegt es leider nicht.

Selbst wenn ich nur einmal eine Animation anzeige und diese dann später wieder verstecke habe ich sowohl beim Laden als auch beim Verstecken unschöne Effekte. Wahrscheinlich wird der alte Hintergrund zu langsam wieder hergestellt und die Animation zu langsam aufgebaut oder sowas ähnliches.
Kann man da irgendwie Abhilfe schaffen?

Jens

Udo Kanter

Re: QT - QMovie Flacker Effekt

#4 Post by Udo Kanter »

Vielleicht hilft Dir folgender Hinweis:

One common use of the QPixmap class is to enable smooth updating of widgets. Whenever something complex needs to be drawn, you can use a pixmap to obtain flicker-free drawing, like this:


Create a pixmap with the same size as the widget.
Fill the pixmap with the widget background color.
Paint the pixmap.
bitBlt() the pixmap contents onto the widget.

Pixel data in a pixmap is internal and is managed by the underlying window system. Pixels can be accessed only through QPainter functions, through bitBlt(), and by converting the QPixmap to a QImage.

Post Reply