//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 ¢er, 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的填充区域的并集。
}
QPainterPath方法功能(QT5.12)
最新推荐文章于 2024-08-26 17:15:52 发布