Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

El momento ajá!

  1. Ha­­cer un "fa­­de in" de un wi­­dget

  2. Se­­tear una va­­ria­­ble

  3. Ha­­cer un "fa­­de in" de otro wi­­dget

Es im­por­tan­te ha­cer­lo en ese or­den y es im­por­tan­te que la apli­ca­ción si­ga res­pon­dien­do.

Acá es­tá el có­di­go que usé (sim­pli­fi­ca­do­):

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 mu­chos otros len­gua­jes se ha­ce lo mis­mo, y en Ja­vas­cript es un tru­co co­mú­n... ¡pe­ro Py­Qt es un wra­pper de C++!

Me pa­re­ce que es­te ti­po de uso mues­tra el va­lor agre­ga­do que Py­Qt te da, no es so­la­men­te que con py­thon evi­tás la com­pi­la­ción abu­rri­da, o que te­nés la in­creí­ble bi­blio­te­ca es­tán­da­r, sino que el len­gua­je mis­mo te de­ja ha­cer co­sas que no son prác­ti­cas 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 ve­ces pro­gra­mar es co­mo una ca­che­ta­da... te das cuen­ta que co­sas que usás sin pen­sar no son na­da tri­via­le­s.

Así que re­cuer­da jo­ven apren­di­z: po­dés ele­gir las he­rra­mien­ta­s. Ele­gí con cui­da­do.


Contents © 2000-2020 Roberto Alsina