PyQt und QML (Farbwechsel eines QFrames)

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Hallo alle,
ich suche nach einer Möglichkeit die Hintergrundfarbe eines QFrames in einer Animation zu wechseln. So soll das QFrame zum Beispiel ganz Transparent sein und dann langsam rot werden.

Bei meiner Suche bin ich auf das mir bisher unbekannte QML gestoßen, welches die Funktion ColorAnimation beinhaltet. Mit dieser Funktion sollte mir dies, soweit ich das sehe, möglich sein. Das Problem ist nur, dass ich nicht verstehe, wie ich QML in Python integrieren kann, beziehungsweise wie ich die ColorAnimation auf das QFrame anwenden kann.

Ich würde mich freuen, wenn mir jemand da unter die Arme greift und vllt. einen kleinen Beispielcode postet. Auch bin ich natürlich offen für weitere Vorschläge, wie ich mein Ziel erreiche ...

Liebe Grüße
lunar

@Trubinial Guru: Du kannst "ColorAnimation" gar nicht auf "QFrame" anwenden. QML ist ein eigenständiges System für graphische Oberflächen, und hat per se nichts mit "QWidget"-Steuerelementen zu tun. "ColorAnimation" ist ein Element aus der QML-Sprache, welches mithin auch nur in dieser Sprache verwendet werden kann. QML kann allerdings nur QML-basierte Oberfläche beschreiben, und keine "QWidget"-Steuerelemente wie "QFrame". Anders gesagt: QML-Animationen kannst Du nur auf QML-Elemente anwenden. Dazu musst Du Deine Oberfläche mithin auch vollständig in QML schreiben.

Um "QWidget"-Steuerelemente zu animieren, gibt es "QAbstractAnimation" und davon abgeleitete Klassen. In Deinem Fall hilft Dir das allerdings nur bedingt, da es keine direkte Möglichkeit gibt, die Hintergrundfarbe von "QWidget"-Objekten zu verändern. Man muss vielmehr die Farbpalette des entsprechenden Steuerelements anpassen, was von der zur Verfügung gestellten Animationsklassen nicht unterstützt wird.

Langer Rede, kurzer Sinn: Du musst diese Animation für "QFrame" wohl oder übel selbst implementieren. Alternativ implementierst Du die graphische Oberfläche vollständig in QML.
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Vielen Dank für die Infos! Das hat mir wohl noch eine menge rumgesuche erspart. Wie konnte denn so eine Implementierung aussehen?
lunar

@Trubinial Guru: Ist das nicht offensichtlich? Du nutzt einen QTimer, um die Hintergrundfarbe des Frames periodisch zu aktualisieren, bis Du bei der gewünschten Farbe angekommen bist.
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Die Classe war mir auch noch unbekannt - aber sie ist ja echt nützlich. Ich hatte mir ja schon fast überlegt nen QThread zu machen, aber das ist viel zu umständlich und irgendwie auch unpassend.

Ich hab es also mit deiner Empfehlung gelöst :

Code: Alles auswählen

global frame
frame=-1
global alpha
alpha=0
        
self.timer=QtCore.QTimer()
self.connect(self.timer, QtCore.SIGNAL('timeout()'), self.update_color_animation)

self.timer.start(6)

Code: Alles auswählen

    def update_color_animation(self):
        global frame
        global alpha
        
        frame=frame+1
        
        if frame!=0 and frame<=17:
            alpha=alpha+15
            
        if frame!=0 and frame>=17:
            alpha=alpha-15
        
        self.frame.setStyleSheet("background-color: rgb(85, 255, 0,%s);"%(str(alpha)))
        
        if frame==33:
            frame=0
            self.timer.stop()
Es Funktioniert super - vielen Dank!
BlackJack

@Trubinial Guru: Jetzt musst Du nur noch das ``global`` loswerden…
Antworten