package DisplayWidget; use strict; use warnings; use QtCore4; use QtGui4; # [DisplayWidget class definition] use QtCore4::isa qw( Qt::Widget ); use QtCore4::slots setBackground => ['int'], setColor => ['const Qt::Color &'], setShape => ['int']; use constant { House => 0, Car => 1 }; use constant { Sky => 0, Trees => 1, Road => 2 }; sub background() { return this->{background}; } sub shapeColor() { return this->{shapeColor}; } sub shape() { return this->{shape}; } sub shapeMap() { return this->{shapeMap}; } sub moon() { return this->{moon}; } sub tree() { return this->{tree}; } # [DisplayWidget class definition] sub NEW { my ($class, $parent) = @_; $class->SUPER::NEW($parent); my $car = Qt::PainterPath(); my $house = Qt::PainterPath(); this->{tree} = Qt::PainterPath(); this->{moon} = Qt::PainterPath(); my $file = Qt::File('resources/shapes.dat'); $file->open(Qt::File::ReadOnly()); my $stream = Qt::DataStream($file); no warnings qw(void); $stream >> $car >> $house >> this->{tree} >> this->{moon}; use warnings; $file->close(); this->{shapeMap} = { Car() => $car, House() => $house }; this->{background} = Sky; this->{shapeColor} = Qt::Color(Qt::darkYellow()); this->{shape} = House; } # [paint event] sub paintEvent { my ($event) = @_; my $painter = Qt::Painter(); $painter->begin(this); $painter->setRenderHint(Qt::Painter::Antialiasing()); this->paint($painter); $painter->end(); } # [paint event] # [paint function] sub paint { my ($painter) = @_; #[paint picture] $painter->setClipRect(Qt::Rect(0, 0, 200, 200)); $painter->setPen(Qt::NoPen()); if (this->background == Trees) { $painter->fillRect(Qt::Rect(0, 0, 200, 200), Qt::Color(Qt::darkGreen())); $painter->setBrush(Qt::Brush(Qt::Color(Qt::green()))); $painter->setPen(Qt::black()); for (my $y = -55, my $row = 0; $y < 200; $y += 50, ++$row) { my $xs; if ($row == 2 || $row == 3) { $xs = 150; } else { $xs = 50; } for (my $x = 0; $x < 200; $x += $xs) { $painter->save(); $painter->translate($x, $y); $painter->drawPath(this->tree); $painter->restore(); } } } elsif (this->background == Road) { $painter->fillRect(Qt::Rect(0, 0, 200, 200), Qt::Color(Qt::gray())); $painter->setPen(Qt::Pen(Qt::Brush(Qt::Color(Qt::white())), 4, Qt::DashLine())); $painter->drawLine(Qt::Line(0, 35, 200, 35)); $painter->drawLine(Qt::Line(0, 165, 200, 165)); } else { $painter->fillRect(Qt::Rect(0, 0, 200, 200), Qt::Color(Qt::darkBlue())); $painter->translate(145, 10); $painter->setBrush(Qt::Brush(Qt::Color(Qt::white()))); $painter->drawPath(this->moon); $painter->translate(-145, -10); } $painter->setBrush(Qt::Brush(this->shapeColor)); $painter->setPen(Qt::black()); $painter->translate(100, 100); $painter->drawPath(this->shapeMap->{this->shape}); #[paint picture] } # [paint function] sub color { return this->shapeColor; } sub setBackground { my ($background) = @_; this->{background} = $background; this->update(); } sub setColor { my ($color) = @_; this->{shapeColor} = $color; this->update(); } sub setShape { my ($shape) = @_; this->{shape} = $shape; this->update(); } 1;