1. 点、线

1.1 点

// 带 F 表示参数为浮点数,否则为整型数
void drawPoint(const QPointF &position)
void drawPoint(const QPoint &position)
void drawPoint(int x, int y)

void drawPoints(const QPointF *points, int pointCount)
void drawPoints(const QPolygon &points)
void drawPoints(const QPolygonF &points)
void drawPoints(const QPoint *points, int pointCount)

1.2 线

// 带 F 表示参数为浮点数,否则为整型数
void drawLine(const QLineF &line)
void drawLine(const QLine &line)
void drawLine(const QPoint &p1, const QPoint &p2)
void drawLine(const QPointF &p1, const QPointF &p2)
void drawLine(int x1, int y1, int x2, int y2)

void drawLines(const QLineF *lines, int lineCount)
void drawLines(const QList<QLine> &lines)
void drawLines(const QList<QLineF> &lines)
void drawLines(const QList<QPoint> &pointPairs)
void drawLines(const QList<QPointF> &pointPairs)
void drawLines(const QLine *lines, int lineCount)
void drawLines(const QPoint *pointPairs, int lineCount)
void drawLines(const QPointF *pointPairs, int lineCount)

2. 多段线、多边形

2.1 多段线

将多个点连接形成多段线
比如,数组中有 ABCD 四个点,会将A和B连接,B和C连接,C和D连接,形成一个多段线

// 带 F 表示参数为浮点数,否则为整型数
void drawPolyline(const QPointF *points, int pointCount)        // 参1:点的数组,参2:点的个数
void drawPolyline(const QPolygonF &points)                      // 参数:多边形

void drawPolyline(const QPoint *points, int pointCount)
void drawPolyline(const QPolygon &points)

2.2 多边形

类似于绘制多段线的参数,但是会形成一个封闭的图形
比如,数组中有 ABCD 四个点,会将A和B连接,B和C连接,C和D连接,最后再将D和A连接,形成一个多边形

// 带 F 表示参数为浮点数,否则为整型数
void drawPolygon(const QPointF *points,
                 int pointCount,
                 Qt::FillRule fillRule = Qt::OddEvenFill);
void drawPolygon(const QPolygonF &points,
                 Qt::FillRule fillRule = Qt::OddEvenFill);
                 
void drawPolygon(const QPoint *points,
                 int pointCount,
                 Qt::FillRule fillRule = Qt::OddEvenFill);
void drawPolygon(const QPolygon &points,
                 Qt::FillRule fillRule = Qt::OddEvenFill);

3. 矩形、圆角矩形

3.1 矩形

// 带 F 表示参数为浮点数,否则为整型数
void drawRect(const QRectF &rectangle)
void drawRect(const QRect &rectangle)

// 指定左上角的顶点,以及宽高
void drawRect(int x, int y, int width, int height)

3.2 圆角矩形

// 带 F 表示参数为浮点数,否则为整型数
// 最后一个参数 Qt::SizeMode 是一个枚举类型,取值为:
//     Qt::AbsoluteSize: 则 xRadius 和 yRadius 为圆角大小
//     Qt::RelativeSize:则 xRadius 和 yRadius 为圆角百分比
void drawRoundedRect(const QRectF &rect,
                     qreal xRadius,
                     qreal yRadius,
                     Qt::SizeMode mode = Qt::AbsoluteSize)
void drawRoundedRect(const QRect &rect,
                     qreal xRadius,
                     qreal yRadius,
                     Qt::SizeMode mode = Qt::AbsoluteSize)
void drawRoundedRect(int x, int y, int w, int h,
                     qreal xRadius,
                     qreal yRadius,
                     Qt::SizeMode mode = Qt::AbsoluteSize)

4. 圆、椭圆

当指定的矩形为正方形,或者rxry相等时,绘制的就是圆

// 直接制定一个矩形
void drawEllipse(const QRectF &rectangle);
void drawEllipse(const QRect &rectangle);

// 通过左上角的顶点和宽高,来指定一个矩形
void drawEllipse(int x, int y, int width, int height);        

// 通过指定中心 和 rx、ry
void drawEllipse(const QPointF &center, qreal rx, qreal ry);
void drawEllipse(const QPoint &center, int rx, int ry);

5. 圆弧、饼图、弦图

5.1 圆弧

绘制圆弧时,需要指定一个矩形,以及开始角度startAngel、跨度角度spanAngle
角度的起始零点为时钟三点钟位置,逆时针增加。一圈的跨度为360x16,半圈为180x16

// 直接指定一个矩形对象
void drawArc(const QRectF &rectangle, int startAngle, int spanAngle);
void drawArc(const QRect &rectangle, int startAngle, int spanAngle);

// 通过指定左上角的顶点和宽高来指定一个矩形
void drawArc(int x, int y, int width, int height, int startAngle, int spanAngle);

5.2 饼图

绘制饼图时,和绘制圆弧类似,也需要指定一个矩形,以及开始角度startAngel、跨度角度spanAngle

// 直接指定一个矩形对象
void drawPie(const QRectF &rectangle, int startAngle, int spanAngle);
void drawPie(const QRect &rectangle, int startAngle, int spanAngle);

// 通过指定左上角的顶点和宽高来指定一个矩形
void drawPie(int x, int y, int width, int height, int startAngle, int spanAngle);

5.3 弦图

绘制饼图时,和绘制圆弧类似,也需要指定一个矩形,以及开始角度startAngel、跨度角度spanAngle

// 直接指定一个矩形对象
void drawChord(const QRectF &rectangle, int startAngle, int spanAngle);
void drawChord(const QRect &rectangle, int startAngle, int spanAngle);

// 通过指定左上角的顶点和宽高来指定一个矩形
void drawChord(int x, int y, int width, int height, int startAngle, int spanAngle);

6. 路径/贝瑟尔曲线

// 直接指定一个 QPainterPath 对象
void drawPath(const QPainterPath &path)

drawPath()需要一个QPainterPath 对象,其常用方法

// 移动到指定的点,开始指定路径
void moveTo(const QPointF &point);
void moveTo(qreal x, qreal y);

// 以直线的方式,路径到指定的点
void lineTo(const QPointF &endPoint);
void lineTo(qreal x, qreal y);

// 以贝瑟尔曲线的方式,路径到指定的点
// 具体来说:使用控制点c1和c2,在当前点和结束点之间,绘制一条贝瑟尔曲线
void cubicTo(const QPointF &c1, const QPointF &c2, const QPointF &endPoint);
void cubicTo(qreal c1X, qreal c1Y, qreal c2X, qreal c2Y, qreal endPointX, qreal endPointY);

贝瑟尔曲线,常用于速度、动画等的控制,这不是我们的重点
关于贝瑟尔曲线的动态演示,可以查看这里:http://yisibl.github.io/cubic-bezier

7. 文本、图片

7.1 文本

// 通过指定矩形,来绘制文本
void drawText(const QRectF &rectangle,
              int flags,
              const QString &text,
              QRectF *boundingRect = nullptr);
void drawText(int x,
              int y,
              const QString &text);
void drawText(const QRect &rectangle,
              int flags,
              const QString &text,
              QRect *boundingRect = nullptr);
void drawText(int x,
              int y,
              int width,
              int height,
              int flags,
              const QString &text,
              QRect *boundingRect = nullptr);
void drawText(const QRectF &rectangle,
              const QString &text,
              const QTextOption &option = QTextOption());

// 通过指定点,来绘制文本
void drawText(const QPointF &position, const QString &text);
void drawText(const QPoint &position, const QString &text);

7.2 图片

带有 source 参数的方法:将 pixmap 的 source 指定的矩形区域的部分,绘制到 target 指定的矩形区域上

// 通过指定矩形,来绘制图片
void drawPixmap(const QRectF &target,
                const QPixmap &pixmap,
                const QRectF &source);
void drawPixmap(const QRect &target,
                const QPixmap &pixmap,
                const QRect &source);
void drawPixmap(int x,
                int y,
                int w,
                int h,
                const QPixmap &pixmap,
                int sx,
                int sy,
                int sw,
                int sh);
void drawPixmap(const QRect &rectangle,
                const QPixmap &pixmap);
void drawPixmap(int x,
                int y,
                int width,
                int height,
                const QPixmap &pixmap);
// 通过指定点,来绘制图片
void drawPixmap(const QPointF &point,
                const QPixmap &pixmap,
                const QRectF &source);
void drawPixmap(const QPoint &point,
                const QPixmap &pixmap,
                const QRect &source);
void drawPixmap(const QPointF &point,
                const QPixmap &pixmap);
void drawPixmap(const QPoint &point,
                const QPixmap &pixmap);
void drawPixmap(int x,
                int y,
                const QPixmap &pixmap);
void drawPixmap(int x,
                int y,
                const QPixmap &pixmap,
                int sx,
                int sy,
                int sw,
                int sh);