2018-12-29 00:46:47 +08:00
|
|
|
#include <QtGui>
|
|
|
|
#include "renderarea.h"
|
|
|
|
#include "pixmaps.h"
|
|
|
|
|
|
|
|
RenderArea::RenderArea(QWidget *parent)
|
|
|
|
: QWidget(parent)
|
|
|
|
{
|
|
|
|
setBackgroundRole(QPalette::Base);
|
|
|
|
setAutoFillBackground(true);
|
|
|
|
|
|
|
|
setFixedWidth(600);
|
|
|
|
setFixedHeight(500);
|
|
|
|
}
|
|
|
|
|
|
|
|
void RenderArea::draw(QPainter *painter)
|
|
|
|
{
|
|
|
|
static const QPoint points[4] = {
|
|
|
|
QPoint(10, 80),
|
|
|
|
QPoint(20, 10),
|
|
|
|
QPoint(80, 30),
|
|
|
|
QPoint(90, 70)
|
|
|
|
};
|
|
|
|
|
|
|
|
QRect rect(10, 20, 80, 60);
|
|
|
|
|
|
|
|
QPainterPath path;
|
|
|
|
path.moveTo(20, 80);
|
|
|
|
path.lineTo(20, 30);
|
|
|
|
path.cubicTo(80, 0, 50, 50, 80, 80);
|
|
|
|
|
|
|
|
int startAngle = 20 * 16;
|
|
|
|
int arcLength = 120 * 16;
|
|
|
|
|
|
|
|
QLinearGradient linearGrad(QPointF(0, 0), QPointF(100, 100));
|
|
|
|
linearGrad.setColorAt(0, Qt::black);
|
|
|
|
linearGrad.setColorAt(1, Qt::red);
|
|
|
|
|
|
|
|
QRadialGradient radialGrad(QPointF(50, 50), 40, QPointF(75, 50));
|
|
|
|
radialGrad.setColorAt(0, Qt::white);
|
|
|
|
radialGrad.setColorAt(0.5, Qt::black);
|
|
|
|
radialGrad.setColorAt(1, Qt::red);
|
|
|
|
|
|
|
|
/*QConicalGradient conGrad(QPointF(50, 50), 90);
|
|
|
|
conGrad.setColorAt(0, Qt::blue);
|
|
|
|
conGrad.setColorAt(0.5, Qt::red);
|
|
|
|
conGrad.setColorAt(1, Qt::green);
|
|
|
|
QBrush brush = QBrush(conGrad);*/
|
|
|
|
|
|
|
|
QBrush brush = QBrush(Qt::gray);
|
|
|
|
int brushStyle = Qt::NoBrush;
|
|
|
|
int penStyle = Qt::NoPen;
|
|
|
|
int shape = Rect;
|
|
|
|
int drawnRects = 0;
|
|
|
|
for (int x = 0; x < width(); x += 100){
|
|
|
|
for (int y = 0; y < height(); y += 100){
|
|
|
|
painter->save();
|
|
|
|
painter->setRenderHint(QPainter::Antialiasing);
|
|
|
|
|
|
|
|
shape = (shape + 1)%14;
|
|
|
|
|
|
|
|
penStyle = (penStyle + 1)%4;
|
|
|
|
if(!penStyle)
|
|
|
|
penStyle = 1;
|
|
|
|
|
|
|
|
if (shape == RoundedRect && drawnRects < 2){
|
|
|
|
if (drawnRects == 0)
|
|
|
|
painter->setBrush(QBrush(linearGrad));
|
|
|
|
else if (drawnRects == 1)
|
|
|
|
painter->setBrush(QBrush(radialGrad));
|
|
|
|
drawnRects++;
|
|
|
|
} else {
|
|
|
|
brushStyle = (brushStyle + 1)%14;
|
|
|
|
if(!brushStyle)
|
|
|
|
brushStyle = 1;
|
|
|
|
brush.setStyle((Qt::BrushStyle)brushStyle);
|
|
|
|
painter->setBrush(brush);
|
|
|
|
}
|
|
|
|
|
|
|
|
painter->setPen(QPen(Qt::black, 2, (Qt::PenStyle)penStyle, Qt::FlatCap, Qt::MiterJoin));
|
|
|
|
painter->translate(x, y);
|
|
|
|
switch (shape) {
|
|
|
|
case Line:
|
|
|
|
painter->drawLine(rect.bottomLeft(), rect.topRight());
|
|
|
|
break;
|
|
|
|
case Polyline:
|
|
|
|
painter->drawPolyline(points, 4);
|
|
|
|
break;
|
|
|
|
case Polygon:
|
|
|
|
painter->drawPolygon(points, 4);
|
|
|
|
break;
|
|
|
|
case Rect:
|
|
|
|
painter->drawRect(rect);
|
|
|
|
break;
|
|
|
|
case RoundedRect:
|
|
|
|
painter->drawRoundedRect(rect, 25, 25, Qt::RelativeSize);
|
|
|
|
break;
|
|
|
|
case Ellipse:
|
|
|
|
painter->drawEllipse(rect);
|
|
|
|
break;
|
|
|
|
case Arc:
|
|
|
|
painter->drawArc(rect, startAngle, arcLength);
|
|
|
|
break;
|
|
|
|
case Chord:
|
|
|
|
painter->drawChord(rect, startAngle, arcLength);
|
|
|
|
break;
|
|
|
|
case Pie:
|
|
|
|
painter->drawPie(rect, startAngle, arcLength);
|
|
|
|
break;
|
|
|
|
case Path:
|
|
|
|
painter->drawPath(path);
|
|
|
|
break;
|
|
|
|
case Text:
|
|
|
|
painter->drawText(rect, Qt::AlignCenter, "EmfEngine demo");
|
|
|
|
break;
|
|
|
|
case Pixmap:
|
|
|
|
painter->drawPixmap(10, 10, QPixmap(qt_logo_xpm));
|
|
|
|
break;
|
|
|
|
case TiledPixmap:
|
|
|
|
painter->drawTiledPixmap (QRect(10, 10, 64, 64), QPixmap(brick_xpm));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
painter->restore();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
painter->setPen(Qt::darkGray);
|
|
|
|
painter->setBrush(Qt::NoBrush);
|
|
|
|
painter->drawRect(QRect(9, 9, width() - 18, height() - 18));
|
|
|
|
}
|
|
|
|
|
|
|
|
void RenderArea::paintEvent(QPaintEvent * /* event */)
|
|
|
|
{
|
|
|
|
QPainter painter(this);
|
|
|
|
draw(&painter);
|
|
|
|
}
|