package RenderArea; use strict; use warnings; use QtCore4; use QtGui4; # [0] use QtCore4::isa qw( Qt::Widget ); use QtCore4::slots setShape => ['int'], setPen => ['const QPen &'], setBrush => ['const QBrush &'], setAntialiased => ['bool'], setTransformed => ['bool']; use constant { Line => 1, Points => 2, Polyline => 3, Polygon => 4, Rect => 5, RoundedRect => 6, Ellipse => 7, Arc => 8, Chord => 9, Pie => 10, Path => 11, Text => 12, Pixmap => 13 }; sub shape() { return this->{shape}; } sub pen() { return this->{pen}; } sub brush() { return this->{brush}; } sub antialiased() { return this->{antialiased}; } sub transformed() { return this->{transformed}; } sub pixmap() { return this->{pixmap}; } # [0] sub NEW { my ($class, $parent) = @_; $class->SUPER::NEW($parent); this->{shap} = Polygon; this->{antialiase} = 0; this->{transformed} = 0; this->{pixmap} = Qt::Pixmap('images/qt-logo.png'); this->setBackgroundRole(Qt::Palette::Base()); this->setAutoFillBackground(1); } # [0] # [1] sub minimumSizeHint { return Qt::Size(100, 100); } # [1] # [2] sub sizeHint { return Qt::Size(400, 200); } # [2] # [3] sub setShape { my ($shape) = @_; this->{shape} = $shape; this->update(); } # [3] # [4] sub setPen { my ($pen) = @_; this->{pen} = $pen; this->update(); } # [4] # [5] sub setBrush { my ($brush) = @_; this->{brush} = Qt::Brush($brush); this->update(); } # [5] # [6] sub setAntialiased { my ($antialiased) = @_; this->{antialiased} = $antialiased; this->update(); } # [6] # [7] sub setTransformed { my ($transformed) = @_; this->{transformed} = $transformed; this->update(); } # [7] my @points = ( Qt::Point(10, 80), Qt::Point(20, 10), Qt::Point(80, 30), Qt::Point(90, 70) ); # [8] sub paintEvent { my $rect = Qt::Rect(10, 20, 80, 60); my $path = Qt::PainterPath(); $path->moveTo(20, 80); $path->lineTo(20, 30); $path->cubicTo(80, 0, 50, 50, 80, 80); my $startAngle = 20 * 16; my $arcLength = 120 * 16; # [8] # [9] my $painter = Qt::Painter(this); $painter->setPen(this->pen); $painter->setBrush(this->brush); if (this->antialiased) { $painter->setRenderHint(Qt::Painter::Antialiasing(), 1); # [9] $painter->translate(+0.5, +0.5); } # [10] for (my $x = 0; $x < this->width(); $x += 100) { for (my $y = 0; $y < this->height(); $y += 100) { $painter->save(); $painter->translate($x, $y); # [10] //! [11] if (this->transformed) { $painter->translate(50, 50); $painter->rotate(60.0); $painter->scale(0.6, 0.9); $painter->translate(-50, -50); } # [11] # [12] if (this->shape == Line) { $painter->drawLine($rect->bottomLeft(), $rect->topRight()); } elsif (this->shape == Points) { $painter->drawPoints(Qt::Polygon(\@points)); } elsif (this->shape == Polyline) { $painter->drawPolyline(Qt::Polygon(\@points)); } elsif (this->shape == Polygon) { $painter->drawPolygon(Qt::Polygon(\@points)); } elsif (this->shape == Rect) { $painter->drawRect($rect); } elsif (this->shape == RoundedRect) { $painter->drawRoundedRect($rect, 25, 25, Qt::RelativeSize()); } elsif (this->shape == Ellipse) { $painter->drawEllipse($rect); } elsif (this->shape == Arc) { $painter->drawArc($rect, $startAngle, $arcLength); } elsif (this->shape == Chord) { $painter->drawChord($rect, $startAngle, $arcLength); } elsif (this->shape == Pie) { $painter->drawPie($rect, $startAngle, $arcLength); } elsif (this->shape == Path) { $painter->drawPath($path); } elsif (this->shape == Text) { $painter->drawText($rect, Qt::AlignCenter(), this->tr("Qt by\nNokia")); } elsif (this->shape == Pixmap) { $painter->drawPixmap(10, 10, pixmap); } # [12] //! [13] $painter->restore(); } } $painter->setPen(palette()->dark()->color()); $painter->setBrush(Qt::NoBrush()); $painter->drawRect(Qt::Rect(0, 0, width() - 1, height() - 1)); $painter->end(); } # [13] 1;