Re: Why isn't this easy? implementing File->New
darrik <[email protected]> Wed, 02 Aug 2006 02:25:00 -0400
| Newsgroups | gmane.comp.kde.devel.perl |
|---|---|
| Message-ID | <[email protected]> |
Ashley Winters wrote: > --- darrik <[email protected]> wrote: > >> Ashley Winters wrote: >>> use strict; >>> use Qt; # use Qt in EVERY package! It declares 'this', and does >>> other use-strict-happy things >>> use MyView; >>> sub processFileMenu { >>> if ($option==FILENEW) { >>> MyView(this)->show; >>> } >>> } >> You're not storing a perl reference to the new window anywhere. What >> >> happens when you want to access that window from the parent later? > > Ahh, in that case you want to store it as a member variable. If, for > example, we wanted to populate the Window menu with the list of windows > opened with File->New or something... > > package YourClass; > use strict; > use Qt; > use Qt::isa qw(Qt::Widget); > use Qt::attributes qw(windows); # declare a member variable > use MyView; > > sub NEW { > # standard preamble > > windows = []; # initialize as an array > } > > sub processFileMenu { > if ($option==FILENEW) { > my $viewer = MyView(this); > $viewer->show; > push @{ windows }, $viewer; > } > } > >> This is more evident when you subclass a container widget that has >> child >> controls. For instance: > > I'll make the edits inline... > >> use strict; >> >> package MyWidget; >> >> use Qt; >> use Qt::isa qw( Qt::Widget ); > > use Qt::attributes qw( lbl ); > >> sub NEW { >> # irrelevant method arguments left out for brevity :P >> >> my $class=shift; >> my $parent=shift; >> shift->SUPER::NEW($parent); >> my $layout=Qt::HBoxLayout(this); > #> my $lbl=Qt::Label("label",this); > #> $layout->addWidget($lbl); > > # instead > lbl = Qt::Label("label",this); > $layout->addWidget(lbl); >> } >> >> sub changeChildLabel { >> # how do you access $lbl here? > lbl->setText("Qt::attributes"); >> } > > >> This part has me confused. Storing $lbl in a package variable >> doesn't >> work if you instantiate several MyWidget's. I've been using >> workarounds >> that are inelegant, so a pointer to the *proper* way to do this would >> be >> immensely appreciated. > > Sure. Keep in mind that the 'this' function/variable/keyword thing is, > in fact, a hash. You're free to store things in it, like so: > > this->{'lbl'} = Qt::Label(...); > > In fact, that's all the Qt::attributes pragma does, is setup that > shortcut. It automatically creates a lbl() function which returns > this->{'lbl'}, in a way that lets you assign to it (as an lvalue). > > That's the technical side, at least. For more of a tutorial, read this: > > http://perlqt.sourceforge.net/dist/current/doc/en/index.html#using_attributes > > - Ashley Winters Superb! And well-explained! Thank you kindly! I was thinking about this()->{lbl} but wasn't sure if that would work. The Qt::attributes solution is much cleaner and clearer. Again, thanks a lot! :) Darrik Mazey