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
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.
# -*- 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.
# -*- 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
\n
de 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_
(
))