Qt:玩转QPainter序列六(图形)

前言

继续看源码。

正文

剩下的大部分都是画各种图形的函数,它们一般都有多个重载版本,我就不一 一介绍使用了,只挑其中的一部分使用一下。
在这里插入图片描述
QPainter 类中,这些方法涉及到绘图的各种功能,主要用于设置视图变换、绘制不同类型的图形(如路径、点、线、矩形)等。下面是这些方法的详细解释:

1. 视图变换设置

  • QRect window() const;

    • 返回当前的窗口矩形(绘图区域的逻辑坐标系)。
  • void setWindow(const QRect &window);

    • 设置窗口矩形,定义绘图的逻辑坐标系范围。
  • inline void setWindow(int x, int y, int w, int h);

    • 以整数参数设置窗口矩形。
  • QRect viewport() const;

    • 返回当前的视口矩形(绘图区域的实际坐标系范围)。
  • void setViewport(const QRect &viewport);

    • 设置视口矩形,定义绘图的实际显示区域。
  • inline void setViewport(int x, int y, int w, int h);

    • 以整数参数设置视口矩形。
  • void setViewTransformEnabled(bool enable);

    • 启用或禁用视图变换。启用后,绘图时会应用视图变换。
  • bool viewTransformEnabled() const;

    • 返回视图变换是否启用。

关于上述这些函数是用于设置窗口与物理坐标系的,我有篇博客有讲坐标系Qt坐标系统之三个坐标系和两个变换

2. 绘制路径

  • void strokePath(const QPainterPath &path, const QPen &pen);

    • 使用 QPen 描边 QPainterPath 对象。
  • void fillPath(const QPainterPath &path, const QBrush &brush);

    • 使用 QBrush 填充 QPainterPath 对象。
  • void drawPath(const QPainterPath &path);

    • 绘制 QPainterPath 对象,不进行填充或描边。

例子

void PaintWidget::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);

    QPainter painter(this);
    //设置抗锯齿
    painter.setRenderHint(QPainter::Antialiasing,true);

    // 1. 创建 QPainterPath 对象
    QPainterPath path;
    // 添加一个矩形到路径中
    path.addRect(50, 50, 200, 100);
    // 添加一个椭圆到路径中
    path.addEllipse(100, 75, 100, 50);

    // 2. 创建 QPen 对象用于描边,蓝色描边,宽度为 3
    QPen pen(Qt::blue, 3);
    // 使用 QPen 描边路径
    painter.strokePath(path, pen);

    // 3. 创建 QBrush 对象用于填充,黄色填充
    QBrush brush(Qt::yellow);
    // 使用 QBrush 填充路径
    painter.fillPath(path, brush);

    // 4. 绘制路径(不进行填充或描边)
    // 绘制路径的颜色和样式取决于当前设置的 QPainter 状态,设置描边颜色为绿色
    painter.setPen(Qt::green);
    // 仅绘制路径
    painter.drawPath(path);

}

在这里插入图片描述

3. 绘制点

  • inline void drawPoint(const QPointF &pt);

    • 绘制一个点,参数是 QPointF(浮点坐标)。
  • inline void drawPoint(const QPoint &p);

    • 绘制一个点,参数是 QPoint(整数坐标)。
  • inline void drawPoint(int x, int y);

    • 绘制一个点,参数是整数坐标 (x, y)
  • void drawPoints(const QPointF *points, int pointCount);

    • 绘制一组点,参数是 QPointF 数组和点的数量。
  • inline void drawPoints(const QPolygonF &points);

    • 绘制多边形的点,参数是 QPolygonF 对象。
  • void drawPoints(const QPoint *points, int pointCount);

    • 绘制一组点,参数是 QPoint 数组和点的数量。
  • inline void drawPoints(const QPolygon &points);

    • 绘制多边形的点,参数是 QPolygon 对象。

例子

void PaintWidget::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);

    QPainter painter(this);
    //设置抗锯齿
    painter.setRenderHint(QPainter::Antialiasing,true);
    //设置粗一点
    QPen pen;
    pen.setWidth(10);
    // 创建点的数组
    QPoint points[] = {
        QPoint(50, 50),
        QPoint(100, 100),
        QPoint(150, 150),
        QPoint(200, 200),
        QPoint(250, 250)
    };
    int pointCount = sizeof(points) / sizeof(points[0]);

    // 设置画笔颜色
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 绘制点
    painter.drawPoints(points, pointCount);

    // 创建一个 QPolygon 对象,包含一组点
    QPolygon polygon;
    polygon << QPoint(30, 30)
            << QPoint(80, 80)
            << QPoint(130, 130)
            << QPoint(180, 180)
            << QPoint(230, 230);

    // 设置画笔颜色
    pen.setColor(Qt::green);
    painter.setPen(pen);

    // 绘制点
    painter.drawPoints(polygon);

}


在这里插入图片描述

4. 绘制线

  • inline void drawLine(const QLineF &line);

    • 绘制一条线段,参数是 QLineF(浮点坐标)。
  • inline void drawLine(const QLine &line);

    • 绘制一条线段,参数是 QLine(整数坐标)。
  • inline void drawLine(int x1, int y1, int x2, int y2);

    • 绘制一条线段,参数是起点 (x1, y1) 和终点 (x2, y2) 的整数坐标。
  • inline void drawLine(const QPoint &p1, const QPoint &p2);

    • 绘制一条线段,参数是起点和终点的 QPoint 对象。
  • inline void drawLine(const QPointF &p1, const QPointF &p2);

    • 绘制一条线段,参数是起点和终点的 QPointF 对象。
  • void drawLines(const QLineF *lines, int lineCount);

    • 绘制一组线段,参数是 QLineF 数组和线段的数量。
  • inline void drawLines(const QVector<QLineF> &lines);

    • 绘制一组线段,参数是 QVector<QLineF> 对象。
  • void drawLines(const QPointF *pointPairs, int lineCount);

    • 绘制一组线段,参数是 QPointF 数组中的点对和线段的数量。
  • inline void drawLines(const QVector<QPointF> &pointPairs);

    • 绘制一组线段,参数是 QVector<QPointF> 对象中的点对。
  • void drawLines(const QLine *lines, int lineCount);

    • 绘制一组线段,参数是 QLine 数组和线段的数量。
  • inline void drawLines(const QVector<QLine> &lines);

    • 绘制一组线段,参数是 QVector<QLine> 对象。
  • void drawLines(const QPoint *pointPairs, int lineCount);

    • 绘制一组线段,参数是 QPoint 数组中的点对和线段的数量。
  • inline void drawLines(const QVector<QPoint> &pointPairs);

    • 绘制一组线段,参数是 QVector<QPoint> 对象中的点对。

例子

void PaintWidget::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);

    QPainter painter(this);
    //设置抗锯齿
    painter.setRenderHint(QPainter::Antialiasing,true);
    //设置粗一点
    QPen pen;
    pen.setWidth(5);
    // 1. 使用 QLine 数组绘制线段
    QLine linesArray[] = {
        QLine(10, 10, 100, 10),
        QLine(10, 20, 100, 20),
        QLine(10, 30, 100, 30)
    };
    int lineCountArray = sizeof(linesArray) / sizeof(linesArray[0]);
    pen.setColor(Qt::red);
    painter.setPen(pen);
    painter.drawLines(linesArray, lineCountArray);

    // 2. 使用 QVector<QLine> 对象绘制线段
    QVector<QLine> linesVector;
    linesVector << QLine(10, 50, 100, 50)
                << QLine(10, 60, 100, 60)
                << QLine(10, 70, 100, 70);
    pen.setColor(Qt::green);
    painter.setPen(pen);
    painter.drawLines(linesVector);

    // 3. 使用 QPoint 数组绘制线段(点对)
    QPoint pointsArray[] = {
        QPoint(10, 90), QPoint(100, 90),
        QPoint(10, 100), QPoint(100, 100),
        QPoint(10, 110), QPoint(100, 110)
    };
    int pointCountArray = sizeof(pointsArray) / sizeof(pointsArray[0]) / 2;
    pen.setColor(Qt::blue);
    painter.setPen(pen);
    painter.drawLines(pointsArray, pointCountArray);

    // 4. 使用 QVector<QPoint> 对象绘制线段(点对)
    QVector<QPoint> pointsVector;
    pointsVector << QPoint(10, 130) << QPoint(100, 130)
                 << QPoint(10, 140) << QPoint(100, 140)
                 << QPoint(10, 150) << QPoint(100, 150);
    pen.setColor(Qt::gray);
    painter.setPen(pen);
    painter.drawLines(pointsVector);

}

在这里插入图片描述

5. 绘制矩形

  • inline void drawRect(const QRectF &rect);

    • 绘制一个矩形,参数是 QRectF(浮点坐标)。
  • inline void drawRect(int x1, int y1, int w, int h);

    • 绘制一个矩形,参数是整数坐标 (x1, y1) 和宽高 (w, h)
  • inline void drawRect(const QRect &rect);

    • 绘制一个矩形,参数是 QRect(整数坐标)。

绘制矩形本篇就不说了,留到下一个序列一起说。

  • 29
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值