Hacer un "fade in" de un widget
Setear una variable
Hacer un "fade in" de otro widget
Es importante hacerlo en ese orden y es importante que la aplicación siga respondiendo.
Acá está el código que usé (simplificado):
def fadein(thing, target=1., thendo=None):
"""
* thing is a QWidget
* thing.proxy is a QGraphicsWidget
* thendo is callable
* target is the desired opacity
"""
thing.anim=QtCore.QPropertyAnimation(thing.proxy, "opacity")
thing.anim.setDuration(200)
thing.anim.setStartValue(thing.proxy.opacity())
thing.anim.setEndValue(target)
thing.anim.start()
thing.anim.finished.connect(thing.anim.deleteLater)
if thendo:
thing.anim.finished.connect(thendo)
Y se usa así:
def later():
avar=avalue
fadein(widget2)
fadein(widget1, thendo=later)
¿No es lindo? Tener funciones como objetos de primera clase significa que puedo tomar later
como un closure, junto con widget2
y avar
que sólo necesitan estar definidas en el scope local, y la cadena de llamadas funciona ¡exactamente como quiero!
Sí, en muchos otros lenguajes se hace lo mismo, y en Javascript es un truco común... ¡pero PyQt es un wrapper de C++!
Me parece que este tipo de uso muestra el valor agregado que PyQt te da, no es solamente que con python evitás la compilación aburrida, o que tenés la increíble biblioteca estándar, sino que el lenguaje mismo te deja hacer cosas que no son prácticas en C++.
La única manera que se me ocurre de hacer esto en C++ es crear un slot que sea el equivalente de later
, y encadenarlo a la señal... lo que quiere decir que ese later
descartable se convierte en parte de la interface de la clase. (!?)
Habría que definir later
en algún otro lado del archivo, separado de su único uso (tal vez inine en el header).
Aún así, eso no es equivalente: avalue
podría ser algo no fácil de acceder cuando se ejecuta later
(por ejemplo, el timestamp del primer fadein), habría que buscar donde guardarlo para que later
lo encuentre, no se puede volver a hacer esto hasta después que se ejecute later
... se pone complicado.
A veces programar es como una cachetada... te das cuenta que cosas que usás sin pensar no son nada triviales.
Así que recuerda joven aprendiz: podés elegir las herramientas. Elegí con cuidado.