vyklad kodu

Petr Pajas pajas na ufal.ms.mff.cuni.cz
Úterý Září 16 10:02:59 MEST 2003


koala na vju.cz (Ondrej Koala Vacha) writes:

> Dobry den, nize je uveden vzorovy priklad na perlQt. Nejde mi ted o Qt,
> ale o syntaxi:
>
>   1: use strict;
>   2:
>   3: package Button;
>   4: use Qt;
>   5: use Qt::isa qw(Qt::PushButton);
>   6: use Qt::attributes qw(itsTime);
>   7: use Qt::slots
>   8:     wasClicked => [],
>   9:     change     => ['int', 'int'];
>  10: use Qt::signals
>  11:     changeIt   => ['int', 'int'];
>  12:
>  13: sub NEW
>  14: {
>  15:   shift->SUPER::NEW(@_[0..2]);
>  16:   itsTime = Qt::Time;

Podivej se na to, co dela
use Qt::attributes qw(itsTime);

Nainstaluje lvalue funkci itsTime. To by se primo v perlu dalo udelat
nejak takto:

sub itsTime() : lvalue {
    return \$__itsTime;
}

nicmene to asi funguje jen v novych verzich perlu, viz man attributes,
/lvalue:

lvalue
           Indicates that the referenced subroutine is a valid lvalue and can
           be assigned to. The subroutine must return a modifiable value such
           as a scalar variable, as described in perlsub.

Qt nicmene zavadi attributes pomoci nasledujiciho XS kodu v Qt.xs:

installattribute(package, name)
    char *package
    char *name
    CODE:
    if(!package || !name) XSRETURN_EMPTY;
    char *attr = new char[strlen(package) + strlen(name) + 3];
    sprintf(attr, "%s::%s", package, name);
    char *file = __FILE__;
    // *{ $attr } = sub () : lvalue;
    CV *attrsub = newXS(attr, XS_attr, file);
    sv_setpv((SV*)attrsub, "");
    CvLVALUE_on(attrsub);
    delete[] attr;

Je to od autoru perlQt trochu podvod a slo to asi resit i jinak nez
pomoci lvalue funkci (tak, aby vysledek vypadal "perlovstejc"). Chteli
asi usetrit jedno this-> nebo tak neco. Ale coz, hlavne, ze jim to
chodi :-)

>  17:   itsTime->start;
>  18:   this->connect(this, SIGNAL 'clicked()', SLOT 'wasClicked()');
>  19:   this->connect(this, SIGNAL 'changeIt(int,int)', 
>SLOT 'change(int,int)');
>  20: }

>
>
> Muze mi nekdo rozebrat, co se deje na radku 16, tedy co je itsTime?
> Pokud je to jasne a mne to nedochazi, tak si dopredu pisu cerny
> bod:(
>
> s diky
> --
> Ondrej Koala Vacha

-- Petr


Další informace o konferenci Perl