其他分享
首页 > 其他分享> > Qt开发之绘图与更新绘图

Qt开发之绘图与更新绘图

作者:互联网

关于Qt的绘画,简单介绍吧,一些常用的知识点

Qt中的所有的图都是画出来的,例如我们的按钮,窗口,标签上的图

画图需要两个东西

1.画家QPainter

2.画板QPaintDevice(常见的控件,按钮label窗口)

Qt绘图机制为屏幕显示和打印显示提供了统一的API接口,主要有三部分组成:

(1)QPainter类,提供了画图的各种接口,可方便地绘制各种各样的图形

(2)QPaintDevice类,提供可用于画图的控件,及画图容器

(3)QPainterEngine类,抽象类,提供了QPainter类如何在指定的平台上给

指定的设备绘画的抽象接口,对于开发者而言,一般不会用到

QPainter类(画家)------->QPainterEngine类(翻译)------->QPainterEngine类(设备)

 

主要讲一下QPainter类的用法方法等

QPainter painter(this);

1.画线段 - drawLine()

给定两个点的坐标画一条线段

painter.drawLine(x1, y1, x2, y2);

2.画多条线段 - drawLines()

给定 N 个点,第 1 和第 2 个点连成线,第 3 和第 4 个点连成线,……,N 个点练成 (N+1)/2 条线,如果 N 是奇数,第 N 个点和 (0,0) 连成线。

static const QPointF points[4] = {QPointF(x1, y1),QPointF(x2, y2),QPointF(x3, y3),QPointF(x4, y4)};
painter.drawLines(points, 2); // 4 个点连成 2 条线

3.画折线- drawPolyline()

给定 N 个点,第 1 和第 2 个点连成线,第 2 和第 3 个点连成线,……,第 N-1 和第 N 个点连成线,N 个点共连成 N-1 条线。

static const QPointF points[4] = {QPointF(x1, y1),QPointF(x2, y2),QPointF(x3, y3),QPointF(x4, y4)};
painter.drawPolyline(points, 4);

4.画多边形 - drawPolygon()

给定 N 个点,第 1 和第 2 个点连成线,第 2 和第 3 个点连成线,……,第 N-1 和第 N 个点连成线,第 N 个点和第 1 个点连接成线形成一个封闭的多边形。

static const QPointF points[4] = {QPointF(x1, y1),QPointF(x2, y2),QPointF(x3, y3),QPointF(x4, y4)};
painter.drawPolygon(points, 4);

5.画矩形 - drawRect()

给定矩形左上角的坐标和矩形的长、宽就可以绘制矩形了。

painter.drawRect(x, y, width, height);

6.画圆角矩形- drawRoundRect() & drawRoundedRect()

绘制圆角矩形有 2 个方法:drawRoundRect() 和 drawRoundedRect(),需要给定圆角矩形左上角的坐标、长、宽、圆角的半径。

当 drawRoundedRect() 中第 7 个参数 Qt::SizeMode 为 Qt::RelativeSize 时,表示圆角半径的单位是百分比,取值范围是 [0, 100],此时 drawRoundedRect() 等价于 drawRoundRect(),其实底层是用这个百分比和对应边长的一半相乘得到圆角的半径(单位是像素)。Qt::SizeMode 为 Qt::AbsoluteSize 时,表示圆角半径的单位是像素。

painter.drawRoundRect(0, 0, 100, 100, 50, 50); // 50%, 50%
painter.drawRoundedRect(130, 0, 100, 100, 50, 50, Qt::AbsoluteSize); // 50px, 50px
painter.drawRoundedRect(260, 0, 100, 100, 100, 100, Qt::RelativeSize); // 100%, 100%

7.画椭圆,圆 - drawEllipse()

给定椭圆的包围矩形(bounding rectangle),使用 drawEllipse() 绘制椭圆。圆是特殊的椭圆,椭圆有两个焦点,这两个焦点合为一个的时候就是一个正圆了,当包围矩形是正方形时,drawEllipse() 绘制的就是圆。

当然,画圆的方法很多,上面我们就使用了 drawPolygon(),drawRounedRect() 的方法画圆,不过从语义上来说,用 drawEllipse() 来画圆显得更舒服一些。

painter.drawEllipse(0, 0, 200, 100); // 椭圆
painter.drawEllipse(230, 0, 100, 100); // 圆

8.画弧,弦,饼图 - drawArc(), drawChord(), drawPie()

画弧使用 drawArc()   画弦使用 drawChord()   画饼图用 drawPie()

把这三个函数放在一起介绍,因为它们的参数都一样,而且 arc, chord, pie 外形也有很多相似之处,不太常用

void QPainter::drawArc(const QRectF & rectangle, int startAngle, int spanAngle)
void QPainter::drawPie(const QRectF & rectangle, int startAngle, int spanAngle)
void QPainter::drawChord(const QRectF & rectangle, int startAngle, int spanAngle)

9.绘制 QPixmap - drawPixmap()

Pixmap 的绘制有下面四种方式(每种方式都有几个重载的函数,没有全部列举出来):

(1)在指定位置绘制 pixmap,pixmap 不会被缩放

/* pixmap 的左上角和 widget 上 x, y 处重合 */
void QPainter::drawPixmap(int x, int y, const QPixmap & pixmap)
或者void QPainter::drawPixmap(const QPointF &point, const QPixmap &pixmap)

(2)在指定的矩形内绘制 pixmap,pixmap 被缩放填充到此矩形内

/* target 是 widget 上要绘制 pixmap 的矩形区域 */
void QPainter::drawPixmap(int x, int y, int width, int height, const QPixmap &pixmap)
或者void QPainter::drawPixmap(const QRect &target, const QPixmap &pixmap)

(3)绘制 pixmap 的一部分,可以称其为 sub-pixmap

/* source 是 sub-pixmap 的 rectangle */
void QPainter::drawPixmap(const QPoint &point, const QPixmap &pixmap, const QRect &source)
或者void QPainter::drawPixmap(const QRect &target, const QPixmap &pixmap, const QRect &source)
或者void QPainter::drawPixmap(int x, int y, const QPixmap &pixmap, 
                          int sx, int sy, int sw, int sh)

(4)平铺绘制 pixmap,水平和垂直方向都会同时使用平铺的方式

void QPainter::drawTiledPixmap(const QRect &rectangle, 
                               const QPixmap &pixmap, 
                               const QPoint &position = QPoint())
或者void QPainter::drawTiledPixmap(int x, int y, int width, int height, 
                               const QPixmap & pixmap, 
                               int sx = 0, int sy = 0)

 

 

 

 

标签:pixmap,const,Qt,int,更新,绘图,QPointF,QPainter,个点
来源: https://blog.csdn.net/qq_27524749/article/details/112425554