IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
FAQ Qt FAQ Qt Creator FAQ PyQt & PySide

La FAQ PyQt & PySide

La FAQ PyQt & PySideConsultez toutes les FAQ

Nombre d'auteurs : 4, nombre de questions : 38, dernière mise à jour : 29 août 2021 

 
OuvrirSommaireQtGuiAnimation

Afin d'animer un widget on utilise la classe QPropertyAnimation, qui anime les propriétés des objets Qt.
QPropertyAnimation permet de modifier la valeur de la propriété d'un widget telle que sa position et/ou sa taille.
QPropertyAnimation permet d'animer de nombreux widgets Qt et, donc, PySide.

 
Sélectionnez
# -*- coding: iso-8859-1 -*-
 
import sys
from PySide import QtGui, QtCore
 
## Création de la fenêtre principale.
class Frame(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(600,500)
 
        self.button = QtGui.QPushButton ("Hello", self)
        ## Création de l'objet self.animate issu de QPropertyAnimation.
        ## Nous passons en argument le widget qui sera à animer et la propriété que nous allons animer
        self.animate = QtCore.QPropertyAnimation(self.button, "geometry")
        ## Nous rentrons le délai de l'animation en ms
        self.animate.setDuration(800)
        ## Nous indiquons les propriétés de départ
        self.animate.setStartValue(QtCore.QRect(0, 0, 100, 30))
        ## Puis les propriétés de fin
        self.animate.setEndValue(QtCore.QRect(250, 250, 300, 30))
        ## Et enfin nous démarrons l'animation
        self.animate.start()
       
 
app = QtGui.QApplication(sys.argv)
frame = Frame()
frame.show()
sys.exit(app.exec_())

Le code ci dessous permet de voir d'autres animations possibles, comme QtCore.QPropertyAnimation(widget, "pos") ou QtCore.QPropertyAnimation(self.label, "size"). Nous montrons aussi qu'il est possible de faire des transitions grâce à setKeyValueAt(a, QtCore.QPoint(int, int)), où a est compris entre 0 et 1, 1 représentant le temps total de l'animation (donc 0.5 le milieu).

Pour finir, il est possible de faire défiler l'animation un certain nombre de fois grâce à setLoopCount(int). Si la valeur passée est -1, alors l'animation tourne toujours en boucle. La valeur par défaut est 1. Si on met 2, la boucle se jouera 2 fois et ainsi de suite. Notez que 0 permet de ne pas lancer l'animation.

 
Sélectionnez
# -*- coding: iso-8859-1 -*-
 
import sys
from PySide import QtGui, QtCore
import random
 
## Création de la fenêtre principale.
class Frame(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(500,590)
 
        label = QtGui.QLabel("", self)
        label.move(0, 0)
        label.setPixmap(QtGui.QPixmap("qt-logo.png"))
 
 
        def neige(n,m):
            numero = str(n)+'_'+str(m)
            globals()["self.label"+numero] = QtGui.QLabel("<font color='white'>*</font>", self)
            globals()["self.label"+numero].setFont(QtGui.QFont("fantasy", 20, QtGui.QFont.Black))
            globals()["self.label"+numero].move(n,m)
 
            if (n+m)%2 == 0:
                globals()["self.animate"+numero] = QtCore.QPropertyAnimation(globals()["self.label"+numero], "size")
                globals()["self.animate"+numero].setDuration(1000)
                globals()["self.animate"+numero].setStartValue(QtCore.QSize(0, 0))
                globals()["self.animate"+numero].setEndValue(QtCore.QSize(40, 40))
                globals()["self.animate"+numero].setLoopCount(-1)
                globals()["self.animate"+numero].start()
 
 
        def cre():
            for n in range (35):
                for i in range (15):
                    neige(i*60,n*15)
                    neige(i*60+30,n*60+20)
 
        cre()
 
 
        self.label = QtGui.QPushButton ("Bonnes Fêtes\nde fin d'Année", self)
        self.label.setFont(QtGui.QFont("fantasy", 40, QtGui.QFont.Bold))
        self.label.resize(400,120)
 
 
        self.animate = QtCore.QPropertyAnimation(self.label, "pos")
        self.animate.setDuration(60000)
        self.animate.setStartValue(QtCore.QPoint(0, 0))
        a = 0
        while a < 50:
            x_ = random.randrange(0,101,50)
            y_ = random.randrange(0,471,50)
            self.animate.setKeyValueAt(0.02*a, QtCore.QPoint(int(x_), int(y_)))
            a = a+1
        self.animate.setEndValue(QtCore.QPoint(0, 0))
        self.animate.setEasingCurve(QtCore.QEasingCurve.Linear)
 
        self.animate.setLoopCount(-1)
        self.animate.start()
 
 
 
 
app = QtGui.QApplication(sys.argv)
frame = Frame()
frame.show()
sys.exit(app.exec_())
Créé le 21 janvier 2011  par Jiyuu

Copyright © 2010 developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.