Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Publicaciones sobre qt (publicaciones antiguas, página 9)

Editor: un QTextEdit mejor

Por eso re­fac­to­reé to­das esas co­sas que yo creo que un edi­tor de tex­to de­be te­ner en una lin­da bi­blio­te­ca, pa­ra que la pr­óxi­ma vez que al­guien de­ba rein­ven­tar la rue­da, pue­da usar los bo­ni­tos ra­yos y eje de Ma­ra­ve.

En­ton­ce­s, aquí es­tá Edi­tor, la cla­se con el nom­bre más ob­vio po­si­ble! Es un wi­dget de edi­ción de tex­to pa­ra Py­Qt con fea­tu­res ex­tra, que se pue­de usar co­mo reem­pla­zo de QTextE­dit o QPlain­TextE­di­t.

Por aho­ra, vi­ve aden­tro del SVN de Ma­ra­ve pe­ro tal vez al­gún día sal­ga de ahí.

És­tos son los fea­tu­res:

  • Re­s­al­­ta­­do de si­n­­ta­­xis:

    Y no "en teo­­­ría", co­­­mo QTex­tE­­dit y de­­má­s! Edi­­tor pue­­de re­s­al­­tar un mo­n­­tón de len­­gua­­jes po­r­­que usa GNU sou­r­­ce hi­­gh­­li­­ght via el Sou­r­­ce Hi­­gh­­li­­ght Qt de Lo­­­reno Be­­­tti­­ni.

  • Co­­­rre­c­­tor or­­to­­­grá­­fi­­co

    Si in­s­­ta­­lás PyEn­­chant con los di­c­­cio­­­na­­rios co­­­rre­c­­to­­s, ha­­ce co­­­rre­c­­ción or­­to­­­grá­­fi­­ca on­­li­­ne.

  • Wi­­dge­­ts de Bus­­car y Bus­­car y Ree­m­­pla­­zar

    La cla­­se Edi­­tor te da li­n­­dos wi­­dge­­ts pa­­ra bus­­car y bus­­car y ree­m­­pla­­zar ya co­­­ne­c­­ta­­dos con el wi­­dget del edi­­to­­­r, pa­­ra que lo agre­­gues fá­­ci­l­­men­­te a tu apli­­ca­­ció­­n.

  • Mé­­to­­­dos new/o­­­pen/s­a­ve/s­a­vea­s:

    No im­­ple­­men­­tes abri­­r/­­gua­r­­da­­r, etc! Eso es sie­m­­pre el mis­­mo có­­­di­­go!

Oja­lá le sir­va a al­guien más :-)

¿Tenemos tan poca idea de lo que cuesta el software?

Real­men­te, Ma­ra­ve es co­mo mu­cho un mes de pro­gra­mar par­t-­ti­me. Có­mo pue­de eso hu­ma­na­men­te ser U$S71355 o "1 año per­so­na"?

¿Es­ta ba­su­ra es lo me­jor que te­ne­mos pa­ra es­ti­mar cos­to­s? Si es así, la pr­óxi­ma vez que vean al­go co­mo "El pro­gra­ma X lle­va­ría Y años y cos­ta­ría Z dó­la­res", re­cór­ten­lo por un fac­tor de 10 o má­s.

És­to es lo que cos­tó de­sa­rro­llar Ma­ra­ve:

  • Na­­da

Bue­no, és­to es lo que hu­bie­ra cos­ta­do si lo co­bra­ra:

Es­toy su­po­nien­do unas 100 ho­ras de mi tiem­po. A mi pre­cio de "o­ja­lá me lo pa­guen", U$S 40/ho­ra, son U$S 4000, que quie­re de­cir que Oh­loh le pi­fia por un 1600%.

Por otro la­do, por tan­to tra­ba­jo free­lan­ce no te voy a co­brar pre­cio com­ple­to, lo más se­gu­ro es que te co­bra al­go co­mo U$S 20/ho­ra lo que quie­re de­cir que Oh­loh es­tá un 3000% arri­ba.

En con­clu­sió­n: si te gus­ta mi có­di­go (y lo po­dés ver por vos mis­mo), con­tra­ta­me, soy o in­creí­ble­men­te ba­ra­to o in­creí­ble­men­te rá­pi­do.

Marave 0.6 en la calle

Co­sas nue­va­s:

  • Re­s­al­­ta­­do de si­n­­ta­­xis

  • Plu­­gins

  • Bugs arre­­gla­­dos

  • Ani­­ma­­cio­­­nes más bo­­­ni­­tas

  • Li­m­­pie­­za de có­­­di­­go

Cap­tu­ra de pan­ta­lla gra­tui­ta:

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