QPainter和QPainterPath

  • ​​QPainterPath​​
  • ​​(一)简介​​
  • ​​(二)常用函数​​
  • ​​1.addEllipse()​​
  • ​​2.addPath()​​
  • ​​3.addPolygon()​​
  • ​​4.addRect()​​
  • ​​5.addRoundedRect()​​
  • ​​6.addText()​​
  • ​​7.cubicTo()​​
  • ​​8.lineTo()​​
  • ​​9.arcTo()​​
  • ​​10.setFillRule()​​
  • ​​11.moveTo()​​
  • ​​12.closeSubpath()​​
  • ​​QPainter​​
  • ​​(一)简介​​
  • ​​(二)常用函数​​
  • ​​1.drawArc()​​
  • ​​2.drawChord()​​
  • ​​3.drawRect()​​
  • ​​4.drawLine()​​
  • ​​5.drawPolygon()​​
  • ​​6.drawRoundRect()​​
  • ​​7.drawEllipse()​​
  • ​​8.drawPolyLine()​​
  • ​​9.drawPixmap()​​
  • ​​10.drawText()​​
  • ​​11.drawConvexPolygon()​​
  • ​​12.drawPath()​​
  • ​​13.drawPixmap()​​
  • ​​14.drawPoint()​​
  • ​​15.drawPoints()​​

QPainterPath

(一)简介

QPainterPath 类(绘图路径)提供了一个容器,用于绘图操作,可以创建和重用图形形状。
绘图路径是由许多图形化的构建块组成的对象,例如:矩形、椭圆、直线和曲线。构建块可以加入在封闭的子路径中,例如:矩形或椭圆。封闭的路径的起点和终点是一致的,或者他们可以作为未封闭的子路径独立存在,如:直线和曲线。
QPainterPath 可以被填充、描绘轮廓、裁剪。要为一个指定的绘图路径生成可填充的轮廓,可以使用 QPainterPathStroker 类。与正常绘图相比,QPainterPath 的主要优点在于:复杂的图形只需创建一次,然后只需调用 QPainter::drawPath() 函数即可绘制多次。
QPainterPath 提供了一组函数,可用于获取绘图路径及其元素的信息。除了可以使用 toReversed() 函数来改变元素的顺序外,还有几个函数将 QPainterPath 对象转换成一个多边形表示。

(二)常用函数

1.addEllipse()

​void addEllipse(const QRectF &boundingRectangle)​

QLinearGradient myGradient;
QPen myPen;
QRectF boundingRectangle;
QPainterPath myPath;
myPath.addEllipse(boundingRectangle);
QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath);

​void addEllipse(qreal x, qreal y, qreal width, qreal height)​​ 在其左上角(x, y)、宽度和高度定义的边界矩形内创建一个椭圆,并将其作为一个封闭的子路径添加到绘图器路径中。

2.addPath()

​void addPath(const QPainterPath &path)​​ 加入另一个QPainterPath对象中保存的内容

3.addPolygon()

​void addPolygon(const QPolygonF &polygon)​​ 添加一个多边形

QLinearGradient myGradient;
QPen myPen;
QPolygonF myPolygon;
QPainterPath myPath;
myPath.addPolygon(myPolygon);
QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath);

4.addRect()

​void addRect(const QRectF &rectangle)​

QLinearGradient myGradient;
QPen myPen;
QRectF myRectangle;
QPainterPath myPath;
myPath.addRect(myRectangle);
QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath);

​void addRect(qreal x, qreal y, qreal width, qreal height)​​ 在其左上角(x, y)、宽度和高度定义的边界矩形内创建一个矩形,并将其作为一个封闭的子路径添加到绘图器路径中。

5.addRoundedRect()

​void addRoundedRect(const QRectF &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)​

QRectF rect(150,150,200,150);//(x,y,w,h)
QPainterPath path;
path.addRoundedRect(rect,10,10);

​void addRoundedRect(qreal x, qreal y, qreal w, qreal h, qreal xRadius,qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)​​ 将带有圆角的给定矩形x, y, w, h添加到路径中。 xRadius,yRadiusj角度

QPainterPath path;
path.addRoundedRect(150,150,200,150,10,10);

6.addText()

添加一个字符串
​​​void addText(const QPointF &point, const QFont &font, const QString &text)​

QPoint point(50,50);
QFont f("ZYSong 18030",12);
QPainterPath path;
path.addText(point,f,"Hello");

​void addText(qreal x, qreal y, const QFont &font, const QString &text)​

QFont f("ZYSong 18030",12);
QPainterPath path;
path.addText(50,50,f,"Hello");

7.cubicTo()

​三次贝塞尔曲线​​​​void cubicTo(const QPointF &c1, const QPointF &c2, const QPointF &endPoint)​​ c1,c2,为控制点;endPoint为终点点
​void cubicTo(qreal c1X, qreal c1Y, qreal c2X, qreal c2Y, qreal endPointX, qreal endPointY)​​ (c1x,c1y),(c2x,c2y)为控制点,(endPointx,endPointY)为终点

QPainterPath path;
path.moveTo(100,100);
path.cubicTo(300,100,200,200,300,300);
path.cubicTo(100,300,200,200,100,100);
QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(path);

8.lineTo()

绘制直线
​​​void QPainterPath::lineTo(qreal x, qreal y)​​ 从当前点画一条直线到(x,y)点

9.arcTo()

画弧
​​​void arcTo(const QRectF &rectangle, qreal startAngle, qreal sweepLength)​

​void arcTo(qreal x, qreal y, qreal width, qreal height, qreal startAngle, qreal sweepLength)​

创建一个占据给定矩形的圆弧,从指定的起始角开始,逆时针方向延伸甜度。角度用度数表示。顺时针的弧可以用负角来指定。
注意:这个函数将弧的起始点连接到当前位置(如果它们还没有连接)。添加弧后,当前位置为弧中的最后一点。要画一条回到第一点的线,可以使用closeSubpath()函数。
0.0f表示0°,120.0f表示120°

​​例子​​

10.setFillRule()

设置填充规则
​​​Qt::OddEvenFill​​​奇偶填充规则;​​Qt::WindingFil​​l非零绕组填充(封闭填充)

11.moveTo()

​void moveTo(const QPointF &point)​​​​void moveTo(qreal x, qreal y)​​ 把起始点移动到(x,y)

12.closeSubpath()

​void closeSubpath()​​ 通过在子路径的开始处画一条线来关闭当前子路径,并自动启动一个新路径。新路径的当前点为(0,0)。如果子路径不包含任何元素,则此函数不执行任何操作。

QPainter

(一)简介

QPainter类在小部件和其他绘制设备上执行低级绘制。QPainter提供了高度优化的功能来完成GUI程序所需的大部分绘图。它可以画任何东西,从简单的线条到复杂的形状,如馅饼和和弦。它还可以绘制对齐文本和像素图。通常,它在一个“自然”的坐标系中绘制,但是它也可以进行视图和世界的转换。QPainter可以对继承QPaintDevice类的任何对象进行操作。QPainter的常见用法是在小部件的绘制事件中:构造并自定义(例如设置画笔或画笔)painter。然后画。记得在绘制完QPainter对象后销毁它。例如:

void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(rect(), Qt::AlignCenter, "Qt");
}

QPainter的核心功能是绘图,但是这个类也提供了几个函数,允许您定制QPainter的设置和它的渲染质量,以及其他启用剪切的函数。此外,您可以通过指定画家的合成模式来控制不同的形状如何合并在一起。函数的作用是:指示画家是否处于活动状态。画家是由begin()函数和接受QPaintDevice参数的构造函数激活的。end()函数和析构函数使其失效。与QPaintDevice和QPaintEngine类一起,QPainter构成了Qt绘制系统的基础。QPainter是用于执行绘图操作的类。QPaintDevice表示一个可以使用QPainter绘制的设备。QPaintEngine提供了画家在不同类型的设备上绘制的界面。如果漆器处于活动状态,device()返回漆器在其上绘制的绘制设备,而paintEngine()返回漆器当前运行的绘制引擎。有关更多信息,请参见绘制系统。有时,让别人在一个不寻常的QPaintDevice上作画是可取的。QPainter支持一个静态函数setre定向()来完成这个任务。
警告:当paintdevice(绘图设备)是一个小部件时,QPainter只能在paintEvent()函数或paintEvent()调用的函数中使用

(二)常用函数

1.drawArc()

画弧

​​​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)​​

startAngle是起始角(弧形的起始点与圆心的连线与水平线的夹角)、spanAngle是跨度角

注意:QPainter中的弧度值是以1/16°为单位,在画弧是1°用16表示

QPainter p(this);
p.setPen(pen);
p.setBrush(brush);
QRect rect(50,100,300,200);
int startAngle=30*16;
int spanAngle=120*16;
p.drawArc(rect,startAngle,spanAngle);

2.drawChord()

画弦

​​​void drawChord(const QRectF &rectangle, int startAngle, int spanAngle)​​
​​void drawChord(int x, int y, int width, int height, int startAngle, int spanAngle)​​
​​void drawChord(const QRect &rectangle, int startAngle, int spanAngle)​​
QPainter p(this);
p.setPen(pen);
p.setBrush(brush);
QRect rect(50,100,300,200);
int startAngle=30*16;
int spanAngle=120*16;
p.drawChord(rect,startAngle,spanAngle);

3.drawRect()

画矩形

4.drawLine()

画直线

​​​void drawLine(const QLineF &line)​​
​​​void drawLine(const QLine &line)​​
​​void drawLine(int x1, int y1, int x2, int y2)​​
​​​void drawLine(const QPoint &p1, const QPoint &p2)​​
​​​void drawLine(const QPointF &p1, const QPointF &p2)​​
​​void drawLines(const QLineF *lines, int lineCount)​​
​​void drawLines(const QVector<QLineF> &lines)​​
​​void drawLines(const QPointF *pointPairs, int lineCount)​​
​​void drawLines(const QVector<QPointF> &pointPairs)​​
​​void drawLines(const QLine *lines, int lineCount)​​
​​void drawLines(const QVector<QLine> &lines)​​
​​​void drawLines(const QPoint *pointPairs, int lineCount)​​
​​void drawLines(const QVector<QPoint> &pointPairs)​​

5.drawPolygon()

画多边形

6.drawRoundRect()

圆角矩形

7.drawEllipse()

椭圆

​​​void drawEllipse(const QRectF &rectangle)​​
​​void drawEllipse(const QRect &rectangle)​​
​​​void drawEllipse(int x, int y, int width, int height)​​
​​void drawEllipse(const QPointF ¢er, qreal rx, qreal ry)​​
​​void drawEllipse(const QPoint ¢er, int rx, int ry)​​

8.drawPolyLine()

9.drawPixmap()

10.drawText()

文本

11.drawConvexPolygon()

​​void drawConvexPolygon(const QPointF *points, int pointCount)​​
​​void drawConvexPolygon(const QPolygonF &polygon)​​
​​​void drawConvexPolygon(const QPolygon &polygon)​​

*point是数组;pointCount是点个数

使用当前钢笔绘制数组点中的第一个pointCount点定义的凸多边形。第一个点隐式连接到最后一个点,多边形由当前画笔()填充。如果所提供的多边形不是凸的,即它至少包含一个大于180度的角,则结果是不确定的。在一些平台上(例如X11), drawConvexPolygon()函数可以比drawPolygon()函数更快。

static const QPointF points[4] = {
QPointF(10.0, 80.0),
QPointF(20.0, 10.0),
QPointF(80.0, 30.0),
QPointF(90.0, 70.0)
};

QPainter painter(this);
painter.drawConvexPolygon(points, 4);

12.drawPath()

​void drawPath(const QPainterPath &path)​​ 使用当前的画笔绘制轮廓和当前的画笔填充给定的画家路径。

QPainter p(this);
p.setPen(pen);
p.setBrush(brush);
QPainterPath path;
path.addRect(100,100,200,200);
path.moveTo(300,200);
path.arcTo(100,100,200,200,00.0f,180.0f);
path.closeSubpath();
p.drawPath(path);

13.drawPixmap()

画像素

​​​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(int x, int y, const QPixmap &pixmap, int sx, int sy, int sw, int sh)​​
​​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(const QRect &rectangle, const QPixmap &pixmap)​​
​​void drawPixmap(int x, int y, int width, int height, const QPixmap &pixmap)​​常用

14.drawPoint()

画单个点

​​​void drawPoint(const QPointF &position)​​
​​void drawPoint(const QPoint &position)​​
​​void drawPoint(int x, int y)​​

15.drawPoints()

画多个点
​​​void drawPoints(const QPointF *points, int pointCount)​​​​ *point为数组名,pointCount为个数
​​​void drawPoints(const QPolygonF &points)​​​​​void drawPoints(const QPoint *points, int pointCount)​​
​​​void drawPoints(const QPolygon &points)​​