第1章 绘制矩形

cpp
void CWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
/*创建一支画笔,并且指定当前对象为画布*/
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
/*创建一个矩形*/
QRect rect(0, 0, 100, 50);
painter.save();
painter.translate(this->rect().center());
painter.rotate(135);
painter.setPen(QPen(Qt::green, 2));
painter.setBrush(Qt::red);
painter.drawRect(rect);
painter.restore();
painter.save();
painter.translate(this->rect().center() + QPoint(-35, -35));
painter.rotate(135 + 45);
painter.setPen(QPen(Qt::green, 2));
painter.setBrush(Qt::red);
painter.drawRect(rect);
painter.restore();
painter.save();
painter.translate(this->rect().center() + QPoint(-35, -35) + QPoint(-0, -50));
painter.rotate(135 + 45 + 45);
painter.setPen(QPen(Qt::green, 2));
painter.setBrush(Qt::red);
painter.drawRect(rect);
painter.restore();
}
第2章 裁剪路径
设置裁剪路径。
void setClipPath(const QPainterPath &path, Qt::ClipOperation operation = Qt::ReplaceClip)

cpp
void CWidget::paintEvent(QPaintEvent *event)
{
auto rect = event->rect();
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setBrush(Qt::cyan);
/*指定路径*/
QPainterPath path;
/*
* rect.adjusted(20, 30, -20, -30);
* 原始矩形做一下调整
* rect.adjusted(左, 上, 右, 下);
* 左边界向右移动20(左边内缩)
* 上边界向下移动30(上边内缩)
* 右边界向左移动-20(右边内缩)
* 下边界向上移动30(下边内缩)
* 80表示:宽度方向上的圆角高度为80;
* 60表示:高度方向上的圆角高度为60;
*/
path.addRoundRect(rect.adjusted(20, 30, -20, -30), 80, 60);
/*沿着路径做裁剪*/
painter.setClipPath(path);
/*裁剪好了开始绘制矩形*/
painter.drawRect(rect);
}
第3章 裁剪矩形
设置裁剪矩形。
void setClipRect(const QRectF &rectangle, Qt::ClipOperation operation = Qt::ReplaceClip)

cpp
void CWidget::paintEvent(QPaintEvent *event)
{
auto rect = event->rect();
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
/*裁剪出一个区域绘制一条直线*/
painter.save();
painter.setPen(QPen(Qt::magenta, 20));
painter.setBrush(Qt::cyan);
QRect adjustedRect = rect.adjusted(20, 20, -20, -20); /*调整一下矩形*/
painter.setClipRect(adjustedRect); /*裁剪出这个矩形来*/
painter.drawLine(adjustedRect.topLeft(), adjustedRect.bottomRight()); /*在裁剪出的矩形中绘制直线*/
painter.restore();
/*给未裁剪的区域绘制一个矩形框*/
painter.save();
painter.setPen(QPen(Qt::red, 20));
painter.drawRect(rect);
painter.restore();
}
第4章 裁剪区域
第5章 绘制多边形
void drawConvexPolygon(const QPolygonF &polygon)

cpp
void CWidget::paintEvent(QPaintEvent *event)
{
auto rect = event->rect();
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
/*绘制一个四边形*/
painter.save();
painter.setPen(QPen(Qt::cyan, 2));
painter.setBrush(Qt::cyan);
QPolygonF polygonF;
polygonF.append(QPointF(rect.width() / 2.0, 0.0));
polygonF.append(QPointF(rect.width(), rect.height() / 2.0));
polygonF.append(QPointF(rect.width() / 2.0, rect.height()));
polygonF.append(QPointF(0, rect.height() / 2.0));
painter.drawPolygon(polygonF);
painter.restore();
/*绘制一个三角形*/
painter.save();
painter.setPen(QPen(Qt::red, 2));
painter.setBrush(Qt::red);
QPolygonF polygon;
polygon.append(QPointF(10.0, 80.0));
polygon.append(QPointF(20.0, 10.0));
polygon.append(QPointF(80.0, 60.0));
painter.drawConvexPolygon(polygon);
painter.restore();
}
第6章 绘制折线
void drawPolyline(const QPolygonF &points)

cpp
void CWidget::paintEvent(QPaintEvent *event)
{
auto rect = event->rect();
Q_UNUSED(rect)
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
/*绘制具有4条边的折线*/
painter.save();
painter.setPen(QPen(Qt::cyan, 5));
painter.setBrush(Qt::magenta);
QPolygonF polygonF;
polygonF.append(QPoint(22,33));
polygonF.append(QPoint(78,45));
polygonF.append(QPoint(111,233));
polygonF.append(QPoint(234,88));
polygonF.append(QPoint(34,89));
painter.drawPolyline(polygonF);
painter.restore();
}
第7章 绘制弧形
void drawArc(const QRect &rect, int startAngle, int lenAngle)


cpp
CWidget::CWidget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle("Qt 绘制五角星");
this->resize(600, 600);
qDebug() << "当前对象的宽度:" << this->width() ;
qDebug() << "当前对象的高度:" << this->height() ;
}
CWidget::~CWidget() = default;
void CWidget::paintEvent(QPaintEvent *event)
{
auto rect = event->rect();
Q_UNUSED(rect)
qDebug() << "当前矩形的宽度:" << rect.width();
qDebug() << "当前矩形的高度:" << rect.height() ;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
/*绘制弧形*/
painter.save();
painter.setPen(QPen(Qt::red, 5));
painter.setBrush(Qt::magenta);
QRectF adjustedRect = rect.adjusted(20, 20, -20, -20);
int startAngle = 30 * 16;
int lenAngle = 240 * 16;
painter.drawArc(adjustedRect, startAngle, lenAngle);
painter.restore();
/*绘制虚线矩形*/
painter.save();
painter.setPen(QPen(Qt::blue, 3, Qt::DotLine));
painter.drawRect(adjustedRect);
painter.restore();
}
当前对象的宽度: 600
当前对象的高度: 600
当前矩形的宽度: 600
当前矩形的高度: 600
第8章 绘制弦
painter.drawChord(adjustedRect, startAngle, lenAngle);


cpp
void CWidget::paintEvent(QPaintEvent *event)
{
auto rect = event->rect();
Q_UNUSED(rect)
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
/*绘制弦*/
painter.save();
painter.setPen(QPen(Qt::red, 5));
painter.setBrush(Qt::NoBrush);
QRectF adjustedRect = rect.adjusted(20, 20, -20, -20);
int startAngle = 30 * 16;
int lenAngle = 120 * 16;
painter.drawChord(adjustedRect, startAngle, lenAngle);
painter.restore();
/*绘制虚线矩形*/
painter.save();
painter.setPen(QPen(Qt::blue, 3, Qt::DotLine));
painter.drawRect(adjustedRect);
painter.restore();
}
第9章 绘制扇形
painter.drawPie(adjustedRect, startAngle, lenAngle);


cpp
void CWidget::paintEvent(QPaintEvent *event)
{
auto rect = event->rect();
Q_UNUSED(rect)
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
/*绘制扇形*/
painter.save();
painter.setPen(QPen(Qt::red, 5));
painter.setBrush(Qt::NoBrush);
QRectF adjustedRect = rect.adjusted(20, 20, -20, -20);
int startAngle = 30 * 16;
int lenAngle = 150 * 16;
painter.drawPie(adjustedRect, startAngle, lenAngle);
painter.restore();
/*绘制虚线矩形*/
painter.save();
painter.setPen(QPen(Qt::blue, 3, Qt::DotLine));
painter.drawRect(adjustedRect);
painter.restore();
}