QPainterPath方法功能(QT5.12)


//for starf study

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include<QDebug>
#include<QPainterPath>
#include<QPainter>
#include<QPointF>
#include<QPolygonF>
#include<QVector>
#include <QRegion>
#include<QTransform>
#include<QFont>


//QPainterPath类提供了一个用于绘制操作的容器,可以构造和重用图形形状。
//绘制路径是由许多图形构建块组成的对象,例如矩形、椭圆、直线和曲线。
//QPainterPath对象可用于填充、勾勒和剪裁。
//与常规绘图操作相比,绘制路径的主要优点是复杂形状只需创建一次;然后调用qPaint::drawPath函数就可以多次绘制它们。
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainterPath path(QPointF(19.5,25.5)); //创建一个QPainterPath对象,将给定的起始点作为其当前位置。
    path.addEllipse(QRectF(10,10,100,50)); //在指定的边框内创建椭圆,并将其作为闭合子路径添加到绘制路径。
    //void QPainterPath::addEllipse(qreal x, qreal y, qreal width, qreal height)
    //void QPainterPath::addEllipse(const QPointF &center, qreal rx, qreal ry)
    QVector<QPointF> points;
    points.append(QPointF(80,30));
    points.append(QPointF(80,130));
    points.append(QPointF(180,130));
    points.append(QPointF(180,30));
    QPolygonF myPolygon(points);

    QPainterPath path2(QPointF(0,0));
    path2.addPolygon(myPolygon); //将给定多边形作为(未闭合)子路径添加到路径中。
    path.addPath(path2); //在一个路径中添加另一个路径
    path.addRect(200,100,30,15); //路径中添加矩形
    //void QPainterPath::addRect(const QRectF &rectangle)
    QRegion reg = QRegion(20,200,50,30,QRegion::Ellipse);//QRegion::Rectangle矩形QRegion::Ellipse生成矩形的内切椭圆
    path.addRegion(reg);//添加矩形或内切椭圆
    path.addRoundedRect(QRect(200,200,100,60),15,15,Qt::AbsoluteSize);//添加圆角矩形
    //void QPainterPath::addRoundedRect(qreal x, qreal y, qreal w, qreal h, qreal xRadius, qreal yRadius, Qt::SizeMode mode = ...)
    QFont fnt = QFont("宋体",80,20);
    path.addText(QPointF(50,150),fnt,"测试测试测试测试"); //添加文本。注意:设置的点,是文本域的左下角
    //void QPainterPath::addText(qreal x, qreal y, const QFont &font, const QString &text)
    path.arcMoveTo(QRectF(20,280,50,50),-30); //移动画笔位置,移动到一个新的起点
                                                                        //这个起点是参数1所代表的内切椭圆的某个角度(参数2)上的位置
                                                                        //0度是三点钟位置,正数代表逆时针,负数代表顺时针
    path.arcTo(QRectF(20,280,50,50),30,200); //画出一个矩形的内切圆的部分 参数1是矩形位置,参数2是起始角度(以三点钟方向为0的逆时针),
                                                                //画一个长度为参数3的(圆弧长度)的弧线。
                                                                //画出来的弧线的起点再和arcMoveTo所移动的点相连接
    //void QPainterPath::arcTo(qreal x, qreal y, qreal width, qreal height, qreal startAngle, qreal sweepLength)
    path.closeSubpath();//关闭当前子路径
    path.connectPath(path2); //通过从该路径的最后一个元素到给定路径的第一个元素添加一条线,将给定路径连接到此路径。
    path.lineTo(QPointF(135,135)); //添加从当前位置到给定端点的直线。绘制直线后,当前位置将更新为直线的终点。
    //void QPainterPath::lineTo(qreal x, qreal y)
    path.moveTo(QPointF(155,155)); //将当前点移动到给定点,隐式启动新的子路径并关闭上一个子路径。
    //void QPainterPath::moveTo(qreal x, qreal y)
    path.cubicTo(QPointF(150,150),QPointF(250,250), QPointF(140,300)); //使用参数1和参数2指定的控制点,
            //在当前位置和给定端点之间添加一条三次贝塞尔曲线。添加曲线后,当前位置将更新为曲线的终点。
    //void QPainterPath::cubicTo(qreal c1X, qreal c1Y, qreal c2X, qreal c2Y, qreal endPointX, qreal endPointY)
    path.quadTo(QPointF(300,250), QPointF(140,300));//在当前位置和给定端点之间添加二次贝塞尔曲线,控制点由参数1指定。
                                //添加曲线后,当前点将更新为曲线的终点
    //void QPainterPath::quadTo(qreal cx, qreal cy, qreal endPointX, qreal endPointY)
    path.setElementPositionAt(2,15,15);//将索引处元素的x和y坐标设置为x(参数2)和y(参数3)。
    path.setFillRule(Qt::WindingFill); //绘制路径的填充规则设置为给定的填充规则。
        //Qt::OddEvenFill  指定使用奇偶填充规则填充区域。
        //Qt::WindingFill 指定使用非零缠绕规则填充区域。
    path.swap(path2);
    path.swap(path2);//路径交换
    path.translate(120,20); //关于参数所示点平移
        //void QPainterPath::translate(const QPointF &offset)
    QPainter painter(this);
    painter.fillRect(0, 0, 500, 500, Qt::white);
    painter.setPen(QPen(QColor(79, 106, 25), 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
    painter.setBrush(QColor(122, 163, 39));

    painter.drawPath(path);

    //info
    qDebug()<<path.angleAtPercent(0.65); //返回路径切线在百分比t处的角度。参数t必须介于0和1之间。
                                                                 //角度的正值表示逆时针方向,而负值表示顺时针方向。
    qDebug()<<path.boundingRect(); //将此绘制路径的边界矩形返回为具有浮点精度的矩形。
    qDebug()<<path.contains(QPointF(150,150));//如果给定点在路径内,则返回true,否则返回false。
    //bool QPainterPath::contains(const QRectF &rectangle) const
    //bool QPainterPath::contains(const QPainterPath &p) const  包含检查路径
    qDebug()<<path.controlPointRect(); //返回包含此路径中所有点和控制点的矩形。
                        //此函数的计算速度明显快于精确的boundingRect(),并且返回的矩形始终是boundingRect()返回的矩形的超集。
    qDebug()<<path.currentPosition(); //返回路径的当前位置。
    qDebug()<<path.elementCount(); //返回绘制路径中元素的个数。
    qDebug()<<path.elementAt(4); //返回绘制路径中给定索引处的元素。
    qDebug()<<path.fillRule(); //返回绘制路径当前设置的填充规则。
    qDebug()<<path.intersected(path2); //返回一条路径,该路径是原路径(path)的填充区域和p(path2)的填充区域的交点。
    qDebug()<<path.intersects(QRect(150,100,40,40)); //如果给定矩形中的任何点与路径相交,则返回true;
    //bool QPainterPath::intersects(const QPainterPath &p) const  路径相交判定
    qDebug()<<path.isEmpty(); //如果此路径中没有元素,或者唯一的元素是MoveToElement,则返回true;
    qDebug()<<path.length();//返回当前路径的长度。
    qDebug()<<path.percentAtLength(500); //返回指定长度len和整个路径的百分比。
    qDebug()<<path.pointAtPercent(0.02);//返回当前路径百分比t处的点。参数t必须介于0和1之间。
    qDebug()<<path.simplified();// 返回此路径的简化版本。这意味着合并所有相交的子路径,并返回不包含相交边的路径。连续的平行线也将被合并。
    qDebug()<<path.slopeAtPercent(0.5);//返回路径在百分比t处的坡度。参数t必须介于0和1之间。
    qDebug()<<path.subtracted(path2); //返回一条路径,该路径是p(实参)的填充面积减去原路径的填充面积。
    qDebug()<<path.toFillPolygon( QTransform());//使用QTransform矩阵将路径转换为多边形,并返回多边形。
        //QPolygonF QPainterPath::toFillPolygon(const QMatrix &matrix = QMatrix()) const
    qDebug()<<path.toFillPolygons(QTransform());// 使用QTTransform矩阵将路径转换为多边形列表,并返回该列表。它创建多个多边形
    //QList<QPolygonF> QPainterPath::toFillPolygons(const QMatrix &matrix = QMatrix()) const
    qDebug()<<path.toReversed(); //创建并返回路径的反向副本。
    qDebug()<<path.toSubpathPolygons(QTransform());//使用QTTransform矩阵将路径转换为多边形列表,并返回该列表。该函数为每个子路径创建一个多边形,
                                                //而不考虑相交的子路径(即重叠的边界矩形)。要确保正确填充这些重叠的子路径,请改用toFillPolygons()函数。
    //QList<QPolygonF> QPainterPath::toSubpathPolygons(const QMatrix &matrix = QMatrix()) const
    qDebug()<<path.translated(30,30); //关于参数所示点平移 返回平移后的路径
    //QPainterPath QPainterPath::translated(const QPointF &offset) const
    qDebug()<<path.united(path2); //返回一条路径,该路径是原路径的填充区域和p的填充区域的并集。

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值