#!/usr/bin/perl -w # # PerlQt Example Application: forever # # Draws rectangles forever. # package Counter; # # Counter - a widget that displays an unsigned int continuously. # use Qt 2.0; @ISA = qw(Qt::Label); # # Constructs a Counter # sub new { my $self = shift->SUPER::new(@_[1..$#_]); $self->{'number'} = shift; $self->setText(' 0 rectangles/second'); $self->setAutoResize(1); $self->startTimer(1000); return $self; } # # Timer event is called every second and prints out number # sub timerEvent { my $self = shift; my $number = $self->{'number'}; if(defined $self->{'number'}) { $self->setText(sprintf('%d rectangles/second', $$number)); $$number = 0; } $self->repaint(1); } package Forever; # # Forever - a widget that draws rectangles forever. # use Qt 2.0; @ISA = qw(Qt::Widget); # # Constructs a Forever widget. # sub COLORS () { 120 } sub new { my $self = shift->SUPER::new(@_); my @colors; for my $a (0..COLORS-1) { $colors[$a] = Qt::Color->new(rand(0xff), rand(0xff), rand(0xff)); } my $rectangles = 0; my $counter = Counter->new(\$rectangles); $counter->show(); $self->startTimer(0); @$self{'counter', 'rectangles', 'colors'} = ($counter, \$rectangles, \@colors); return $self; } # # Handles paint events for the Forever widget. # sub paintEvent { my $self = shift; my $colors = $self->{'colors'}; my $paint = Qt::Painter->new; $paint->begin($self); $paint->setWindow(0, 0, 1024, 1024); $paint->setPen(Qt::NoPen); $paint->setBrush($colors->[int(rand(COLORS))]); my $p1 = Qt::Point->new(rand(0x3ff), rand(0x3ff)); my $p2 = Qt::Point->new(rand(0x3ff), rand(0x3ff)); my $r = Qt::Rect->new($p1, $p2); $paint->drawRect($r); $paint->end(); } # # Handles timer events for the Forever widget. # sub timerEvent { my $self = shift; my $rectangles = $self->{'rectangles'}; $self->repaint(0); $$rectangles++; } package main; use Qt 2.0; import Qt::app; $always = Forever->new; $app->setMainWidget($always); $always->show(); exit $app->exec();