文章目录
绘图基础
- 2D 绘图主要是 QPainter、QPaintDevice、QPaintEngine 三个类,主要类的作用
1.QPainter(绘制器)是用来执行绘图的操作,用于描述需要绘制的图形,比如需要绘制
线、矩形、圆形等。
2.QPaintDevice(绘图设备)是抽象出来的需要绘制的绘图设备,即可以在什么上面绘制
图形,比如可在 QWidget、QImage、QPrinter 等上面绘图,
3.QPaintEngine(绘图引擎)提供 QPainter 绘制在不同类型设备上的接口,比如光栅绘图
引擎,OPenGL 绘图引擎等。该类通常由 QPainter 和 QPaintDevice 内部使用,除非
创建自定义的设备类型,否则通常不需要使用该类。
QPainter ==》QPaintEngine ==》 QPaintDevice
4.QPainter 的核心功能就是绘图,该类提供了非常多的函数来完成大多数图形的绘制,可以
绘制线条、圆形、文本、图像等。QPainter 可以在继承自 QPaintDevices 类的任何对象上
绘制图形。QPainter 类的函数提供的功能几乎包括了所有的 2D 绘图功能。
QPainter 绘制图形的步骤
- 创建一个 QPainter 对象
- 调用QPainter::begin(QPaintDevice *);指定绘图设备并开始绘制,此步骤也可在 QPainter
的构造函数中完成。注意:每次调用begin()函数都会把QPainter 的设置重置为默认值 - 调用 QPainter 的成员函数绘制图形,调用 QPainter::end()结束绘制
- 若绘制设备是一个 QWidget 部件,则 QPainter 只能在paintEvent()处理函数中
使用(即,需要子类化 QWidget 部件,并重新实现该函数)。
示例
void paintEvent(QPaintEvent *e){
QPainter pr; //创建对象。
pr.begin(this); //开始在 this 上绘制图形
pr.drawLine(QPoint(11,11), QPoint(111,111)); //绘制一条从点(11,11)到点(111,111)的直线
pr.end(); } //结束绘制。
begin与end函数可省略
绘制直线与 QLineF 类
函数
介绍部分关键函数
起点/终点与分量
void setLine(qreal x1, qreal y1, qreal x2, qreal y2);
//设置直线
void setPoints(const QPointF &p1, const QPointF &p2)
角度与线的长度
qreal angle() const;
//返回直线的角度,范围为 0~359 度
void setAngle(qreal angle)
qreal length() const;
void setLength(qreal length)
qreal angleTo(const QLineF &line) const;
//该线需要旋转多少度才与线 line 的度数相同
QPointF pointAt(qreal t) const;
//返回位于直线上 t*length()处的点。
QLineF normalVector() const;
//返回与此线有相同起点和长度并与该线垂直的线
QLineF unitVector() const;
//返回与此线有相同起点和方向,长度为 1.0 的线,即单位向量。
相交
IntersectType intersect(const QLineF &line, QPointF *intersectionPoint) const
//该线是否与线 line 相交,交 点保存于 intersectionPoint 指针中,若线条平行,则交点不确定。枚举 IntersectType 表示相交的类型.
偏移
void translate(qreal dx, qreal dy);
QLineF translated(const QPointF &offset) const
//移动的是距离而不是位置(虽然 offset 是以点的形式表示的),其中 translate()会改变原直线,而
translated()不会改变原直线,但会返回一个偏移后的副本
其他
QPointF center() const;
//返回该线的占点,相当于 0.5p1() + 0.5p2(); qt5.8
QLine toLine() const;
//返回此线的整数副本(注意:相应数值会被四舍五入为最近的整数)
bool isNull() const;
//若线未设置有效的起点和终点,则返回 true,否则返回 false。
static QLineF fromPolar(qreal length, qreal angle);
//静态的
返回长度为 length,角度为 angle 的线,该线起点位于原点。
示例
class B : public QWidget
{
public:
B(QWidget *p1 = 0) : QWidget(p1) {}
void paintEvent(QPaintEvent *e)
{
QPainter pr(this);
QPoint p1(55, 55);
QPoint p2(111, 11);
QPoint p3(66, 88);
QPoint p4(111, 208);
QLineF a(p1, p2);
QLineF b(p3, p4);
a.setAngle(qreal(30)); // a线顺时旋转角度30
pr.drawLine(a);
pr.drawLine(b);
b.angleTo(a); // b线相对于到a线的顺时针角度
a.angleTo(b); // b线相对于到a线的顺时针角度
a.pointAt(0); // 返回位于直线上 t*length()处的点
auto c = b.normalVector(); // 返回与此线有相同起点和长度并与该线垂直的线
pr.drawLine(c);
c.unitVector(); // 返回与此线有相同起点和方向,长度为 1.0 的线,即单位向量。
QPointF intersectionPoint;
c.intersect(b, &intersectionPoint); // 该线是否与线 line 相交,交 点保存于 intersectionPoint 指针中
c.translate(20, 20); // 中 translate()会改变原直线,而translated()不会改变原直线,但会返回一个偏移后的副本
pr.drawLine(c);
pr.drawLine(c.translated(20, 20));
c.center(); // 返回该线的中点,相当于 0.5*p1() + 0.5*p2()
c.toLine(); // 返回此线的整数副本(注意:相应数值会被四舍五入为最近的整数
c.fromPolar(qreal(), qreal()); // 静态的,返回长度为 length,角度为 angle 的线,该线起点位于原点。
}
};
int main(int a, char *b[])
{
QApplication c(a, b);
B w;
w.resize(444, 333);
w.show();
return c.exec();
}
绘制矩形与 QRectF 类
函数
位置和大小
读取函数 | 移动函数 | 设置函数 |
---|---|---|
top()、y() | moveTop(qreal y); | setY(qreal y); setTop(qreal y); //从顶部改变高度 |
bottom() | moveBottom(qreal y); | setBottom(qreal y); //从底部改变高度 |
left() 、x() | moveLeft(qreal x); | setLeft(qreal x);setX(qreal x); //从左侧改变宽度 |
right() | moveRight(qreal x); | setRight(qreal x); //从右侧改变宽度 |
topLeft() | moveTo(qreal x, qreal y); moveTo(QPointF &pos);moveTopLeft(QPointF &pos); | setTopLeft(QPointF &pos); //从左上角改变大小 |
topRight() | moveTopRight(QPointF &pos); | setTopRight(QPointF &pos); //从右上角改变大小 |
bottomLeft() | moveBottomLeft(QPointF &pos); | setBottomLeft(QPointF &pos);//从左下角改变大小 |
bottomRight() | moveBottomRight(QPointF &pos); | setBottomRight(QPointF &pos);//从右下角改变大小 |
height() | setHeight(qreal height); //从底部改变高度 | |
width() | setWidth(qreal width); //从右侧改变宽度 | |
size() | setSize(QSizeF &size); //设置大小,左上角不变 | |
center() | moveCenter(QPointF &pos); //中心位置 |
- 其余位置和大小函数
void setRect(qreal x, qreal y, qreal width, qreal height);
设置矩形左上角坐标为(x,y),宽为 width,高为 heightvoid setCoords(qreal x1, qreal y1, qreal x2, qreal y2);
设置矩形左上角的坐标为(x1,y1),右下角坐标为(x2,y2);void getRect(qreal *x, qreal *y, qreal *width, qreal *height) const;
把矩形的左上角坐标提取到(x,y)中,宽度提取到 width,高度提取到 height 中。void getCoords(qreal *x1, qreal *y1, qreal *x2, qreal *y2) const;
把矩形的左上角坐标提取到(x1,y1)中,左上角坐标提取到(x2,y2)中。
判断矩形与点
bool contains(const QPointF &point) const;
若点 point 位于矩形内(含边缘),则返回 true。
bool contains(const QRectF &rectangle) const;
若矩形 rectangle 位于该矩形内,则返回 true。
bool contains(qreal x, qreal y) const;
//若点(x,y)在矩形内(含边缘),则返回 true。bool isEmpty() const;
//矩形是否为空,详见下文。
bool isNull() const;
//矩形是否不存在,详见下文。
bool isValid() const;
//矩形是否无效,详见下文。
若 宽度<=0 或 高度<=0,则 isEmpty()返回 true。
若 宽度=0 且 高度 = 0,则 isNull()返回 true。
空矩形意味着是无效的,即 isEmpty==!isValid();
注意:宽度或高宽 < 0 不代表该矩形不存在,若宽度或高度小于 0,矩形会向相反的方
向绘制。
- 示例:
QRectF r1(11,11, 0, 111); //r1.isEmpty() = true; r1.isNull() = false; r1.isValid() = false。
QRectF r2(11,11, 0, 0); //r2.isEmpty() = true; r2.isNull() = true; r2.isValid() = false。
QRectF r3(11,11, −111, −111); //r3.isEmpty() = true; r3.isNull() = false; r3.isValid() = false。
QRectF r4(11,11, 111, 111); //r4.isEmpty() = false; r4.isNull() = false; r4.isValid() = true。
QRectF normalized() const;
返回一个规范化矩形(即有效矩形),若 width() < 0,则交换左右角,若 height()<0,则
交换上下角。比如 QRectF r1(11,11, −111,111); QRectF r2 = r1.normalized(); //r2 =
(11,11,111,111);
平移矩形
void translate(qreal dx, qreal dy); void translate(const QPointF &offset); QRectF translated(qreal dx, qreal dy) const;QRectF translated(const QPointF &offset) const;
函数的原理与 QLineF 类中的相应函数是相同的
QRectF transposed() const;
返回交换该矩形宽度和高度后的副本。
QRectF r1(11,33, 77,99);
QRectF r2=r1.transposed(); //r1 不变,r2 是 r1 交换高宽后的结果,即 r2=(11,33,99,77);
QRectF marginsAdded(const QMarginsF &margins) const;
//qt5.3
QRectF marginsRemoved(const QMarginsF &margins) const;
//qt5.3
返回一个在现有矩形上增加或减小了边距 margins 的新矩形(即调整矩形的宽度和高度)
QRectF r1(33,33,111,111);
//r2=(11,11,155,155);
QRectF r2=r1.marginsAdded(QMarginsF(22,22,22,22)) ;
//r3=(55,55,67,67);
QRectF r3=r1.marginsRemoved(QMarginsF(22,22,22,22)) ;
矩形的交集和并集
QRectF intersected(const QRectF &rectangle) const
返回该矩形与矩形 rectangle 的交集(即两矩形的重叠区域),注意:r1.intersected(r2)相当
于 r1&r2。bool intersects(const QRectF &rectangle) const;
//若该矩形与矩形 rectangle 相交,则返回 true。QRectF united(const QRectF &rectangle) const;
//返回该矩形与矩形 rectangle 的边界矩形。
浮点型与整型间的转换及其他
QRect toAlignedRect() const;
//返回完全包含该矩形的最小 QRect(整数)矩形。
QRect toRect() const;
//根据该矩形返回一个 QReect(整数)矩形,其值将被四舍五入到最接近的整数。
绘制椭圆、弧、弦、扇形、圆角矩形
函数
部分构造函数
-
drawEllipse(const QRectF &rectangle)
绘制椭圆 -
drawArc(const QRect &rectangle, int startAngle, int spanAngle)
绘制弧 -
drawChord(const QRectF &rectangle, int startAngle, int spanAngle)
绘制弦 -
drawPie(const QRectF &rectangle, int startAngle, int spanAngle)
绘制扇形(饼形) -
drawRoundedRect(const QRectF &rect,qreal xRadius, qreal yRadius,Qt::SizeMode mode=Qt::AbsoluteSize)
绘制带圆角的矩形 -
本文以弧为例讲解其绘制的原理,下面我们看看画弧的函数,原型如下:
drawArc(const QRectF &rectangle, int startAngle, int spanAngle);
- 第 1 个参数 rectangle 用于指定该矩形的内接椭圆。
- startAngle 用于指定起始角,spanAngle 表示跨越的度数。注意:startAngle 和
spanAngle 是用于以下椭圆参数方程中的角 θ 的,
x = a cos θ,y = b sin θ; (a 表示椭圆 x 方向的半轴长,b 表示椭圆 y 方向的半轴长)
也就是说 startAngle 并不是指的弧的中心点与起点所连直线与 x 方向的夹角,
startAngle 是用于计算弧的起点坐标的,同理 spanAngle 和 startAngle 共同用于计
算弧的终点坐标。
示例
class B : public QWidget
{
public:
B(QWidget *p1 = 0) : QWidget(p1) {}
void paintEvent(QPaintEvent *e)
{
QPainter pr(this);
QRectF r1 = QRectF(10, 10, 333, 111); // 椭圆的外接矩形
QPointF p1 = r1.center(); // 矩形(即椭圆)中心点。
pr.drawArc(r1, 30 * 16, 111 * 16); // 绘制一段弧。注意:需使用实际度数乘以 16。
qreal pi = 3.1415926; // 指定 π
qreal w = pi / 180;
// 绘制跟踪弧起点的直线
qreal x = (r1.width() / 2) * cos(30 * w) + p1.x(); // 注:三角函数是以弧度形式指定的,而不是角度
qreal y = p1.y() - (r1.height() / 2) * sin(30 * w); // 公式原理详见前文图示。
QPointF p2 = QPointF(x, y); // 弧起点的坐标
pr.drawLine(p1, p2); // 绘制一条从椭圆中心到弧起点的坐标
// 绘制跟踪弧终点的直线
qreal x1 = (r1.width() / 2) * cos(141 * w) + p1.x();
qreal y1 = p1.y() - (r1.height() / 2) * sin(141 * w);
QPointF p3 = QPointF(x1, y1); // 弧终点的坐标
pr.drawLine(p1, p3); // 绘制一条从椭圆中心到弧终点的坐标
}
};
int main(int a, char *b[])
{
QApplication c(a, b);
B w;
w.resize(444, 333);
w.show();
return c.exec();
}
绘制点、折线、多边形(QPolygonF 类)
函数
部分构造函数
drawPoint(const QPointF &position)
绘制点drawPoints(const QPointF *points, int pointCount)
绘制多个点,points 需要数组实参,pointCount 指示需要绘制的点的数量。drawPoints(const QPolygonF &points)
绘制多个点,QPolygonFdrawConvexPolygon(const QPointF *points, int pointCount)
绘制凸多边形drawPolyline(const QPointF *points, int pointCount)
绘制多段线(即折线)drawPolygon(const QPointF *points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill)
绘制多边形
绘制折线和多边形有两种方法
一种是是,根据提供的一系列坐标点,和折线的段数,依次把提供的坐标点相连,从而绘
制成指定段数的折线。一系列的坐标点可以通过数组提供。
一种是提供一个 QPolygonF 或 QPolygon 绘制一个折线或多边形,其实这两个类的本质也
就是一系列的点,只是使用这两个类可提供一些方便使用的函数。
QPolygonF 类函数
bool containsPoint(const QPointF &point, Qt::FillRule fillRule) const;
判断点 pont 是否位于多边形内部QPolygon toPolygon() const;
转换为整型版本的 QPolygonbool isClosed() const;
若多边形的起点与终点相等(此情形称为闭合),则返回 true。void swap(QPolygonF &other);
把该多边形与多边形 other 交换QPolygonF intersected(const QPolygonF &r) const;
返回此多边形与 r 的交集QRectF boundingRect() const;
返回多边形的边界矩形,若多边形为空,则返回 QRectF(0,0,0,0)QPolygonF united(const QPolygonF &r) const;
返回此多变形与 r 的并集QPolygonF subtracted(const QPolygonF &r) const;
返回从该多边形中减去多边形 r 后的新多边形
QPainterPath 类(路径)
介绍
- QPainterPath 类是一个容器,可把图形形状保存其中,需要时可再次使用,也就是说,复
杂的图形只需要使用路径创建一次,然后就可以调用 QPainter::drawPath()函数多次绘制它
们。一个路径就是由多个矩形、椭圆、线条等图形组成的对象,路径可以是封闭的也可以
是非封闭的。 - 图形的绘制步骤:路径始终从当前点开始绘制
- 创建 QPaiterPath 对象
- 使用 moveTo 把当前点移至需要绘制图形的开始位置
- 使用 lintTo()、arcTo()等函数绘制直线、弧等图形,还可使用 addRect()、addEllipse()
等函数把封闭子路径添加到路径 - 使用 QPainter::drawPath()函数绘制路径所描述的图形
QPainter pr(this);
QPainterPath ph;
ph.moveTo(11,11); //把当前点移至(11,11),即从(11,11)处开始绘制。
ph.lineTo(111,11); //绘制一条从(11,11)到(111,11)的直线
ph.lineTo(111,111); //绘制一条从(111,11)到(111,111)的直线
ph.lineTo(11,11); //绘制一条从(111,111)到(11,11)的直线,最终形成一个三角形
ph.addRect(133,11,111,111); //添加一个封闭了矩形到路径。
pr.drawPath(ph); //绘制路径中的图形。
函数
常用绘制函数
moveTo()
:该函数可移动当前点,移动当前点会启用一个新的子路径,并隐式关闭之
前的当前路径。moveTo()只是移动当前点,不会绘制图形。currentPosition()
:该函数可获取当前点的位置,当前点的位置始终是添加的最后一个
子路径的结束位置。closeSubpath()
:该函数通过画一条到子路径开头的线来关闭当前子路径,并开启一个
新的子路径,新路径当前点为(0,0);lineTo(const QPointF &endPoint);
绘制一条到点endPoint的直线addRect(const QRectF &rectangle)
添加矩形,顺时针方向。addEllipse(const QRectF &boundingRectangle)
添加椭圆,顺时针方向addPath(const QPainterPath &path)
添加路径addPolygon(const QPolygonF &polygon)
添加多边形(注意:多边形不会自动封闭)addRoundedRect(const QRectF &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)
添加圆角矩形,顺时针方向addText(const QPointF &point, const QFont &font, const QString &text)
添加文本addRegion(const QRegion ®ion)
添加区域void setFillRule(Qt::FillRule fillRule);
路径的填充规则,默认为 Qt::OddEvenFill(奇偶填充),另一个取值为 Qt::WindingFill(非零绕组填充)。
修改路径
bool isEmpty() const;
若路径中没有元素,或仅有唯一元素 MoveToElement,则返回 true。qreal length() const;
//返回当前路径的长度int elementCount() const;
//返回路径中元素的数量void setElementPositionAt(int index,qreal x,qreal y);
把索引index处的元素的x和y坐标设置为x和y,索引就是绘制图形时使用的moveTo()、
lineTo()等函数的顺序(从 0 开始)。比如
QPainterPath ph;
ph.moveTo(11,11); //索引 0
ph.lineTo(111,11); //索引 1
ph.lineTo(111,111); //索引 2
ph.lineTo(11,111); //索引 3
ph.setElementPositionAt(3,55,55); //把索引 3 的元素 lineTo(11,111)修改为 lineTo(55,55);
QPainterPath::Element elementAt(int index) const;
返回索引 index 处的元素
路径运算的交集、并集、相减、平移
QPainterPath intersected(const QPainterPath &p) const;
返回该路径与路径 p 的填充区域相交的路径。非封闭路径会被视为隐式关闭。贝塞尔曲线可能会变为线段。bool intersects(const QRectF &rectangle) const;
bool intersects(const QPainterPath &p) const;
若该路径与矩形 rectangle 或路径 p 相交,则返回 true。QPainterPath united(const QPainterPath &p) const;
返回该路径与路径 p 的填充区域的并集。非封闭路径会被视为隐式关闭。贝塞尔曲线可能会变为线段。其算法与 QPolygonF::united()类似。QPainterPath subtracted(const QPainterPath &p) const;
返回从该路径中减去路径 p 后的路径,非封闭路径会被视为隐式关闭。贝塞尔曲线可能会变为线段。其算法与 QPolygonF::subtracted()类似。void translate(qreal dx, qreal dy);
QPainterPath translated(qreal dx, qreal dy) const;
把路径中的所有点偏移(dx,dy),即向 x 方向偏移 dx,向 y 方向偏移 dy。
路径运算的交集、并集、相减、平移
QRectF boundingRect() const;
//返回路径的边界矩形。其算法与 QPolygonF::boundingRect()类似QRectF controlPointRect() const;
返回包含路径中所有点和控制点的矩形,该函数返回的矩形总是 boundingRect()函数返回的矩形的超集。void connectPath(const QPainterPath &path)
把该路径与路径 path 相联,并从该路径的最后一个元素添加一条线到路径 path 的第一个元素。bool contains(const QPointF &point) const;
//若点 point 位于路径中(包含轮廓线),则返回 true。bool contains(const QRectF &rectangle) const;
bool contains(const QPainterPath &p) const
若该路径包含矩形 rectangle 或路径 p,则返回 true。若 rectangle 或 p 与该路径有任何交集则返回 false,也就是说两个完全重合的路径会返回 false。void swap(QPainterPath &other);
//把该路径与路径 other 相交换。QPainterPath toReversed() const;
返回一下与该路径相反的路径,比如,若路径以 moveTo(),lineTo(),arcTo()创建,则此函数返回的路径将是 arcTo(),lineTo(),moveTo()。QPainterPath simplified() const;
返回此路径的简化版本,即,合并所有相交子路径,返回没有交叉边的路径,还会合并连续的平行线。简化路径将始终使用填充规则 Qt::OddEvenFile。注:贝塞尔曲线可能会变为线段
贝塞尔曲线
void cubicTo(const QPointF &c1, const QPointF &c2, const QPointF &endPoint);
void cubicTo(qreal c1X, qreal c1Y, qreal c2X, qreal c2Y, qreal endPointX, qreal endPointY)
在当前位置与终点 endPoint 之间添加一条 3 次贝塞尔曲线(Bezier),其中 c1 和 c2 是控制点。添加曲线后,当前点更新为点 endPointvoid quadTo(const QPointF &c, const QPointF &endPoint);
void quadTo(qreal cx, qreal cy, qreal endPointX, qreal endPointY);
在当前位置和 endpoint 之间添加一条二次贝塞尔曲线,其中控制点为 c。添加曲线后,当前点更新为点 endPoint以下函数若路径中有曲线,则百分比参数将映射到贝塞尔曲线方程的 t 参数,此时百分比关于长度不是线性的。qreal angleAtPercent(qreal t) const
//返回路径在百分比 t 处的角度,t 必须位于 0 到 1 之间。qreal slopeAtPercent(qreal t) const;
//返回路径在百分比 t 处的斜率,t 必须位于 0 到 1 之间。qreal percentAtLength(qreal len) const;
//返回长度 len 在整个路径的百分比。QPointF pointAtPercent(qreal t) const;
//返回路径在百分比 t 处的点。t 必须在 0 到 1 之间。
路径转换为多边形
QPolygonF toFillPolygon(const QTransform &matrix) const;
QPolygonF toFillPolygon(const QMatrix &matrix = QMatrix()) const;
使用 matrix 把该路径转换为多边形,然后返回多边形。QList<QPolygonF> toFillPolygons(const QTransform &matrix) const;
QList<QPolygonF> toFillPolygons(const QMatrix &matrix = QMatrix()) const;
使用 matrix 把该路径转换为多边形列表,然后返回多边形列表。QList<QPolygonF> toSubpathPolygons(const QTransform &matrix) const;
QList<QPolygonF> toSubpathPolygons(const QMatrix &matrix = QMatrix()) const;
使用 matrix 把该路径转换为多边形列表,然后返回多边形列表。该函数会为每个子路径都创建一个多边形,而不管相交的子路径。
绘制文本
函数
void drawText(const QRectF &rectangle,int flags,const QString &text,QRectF boundingRect=Q_NULLPTR);
以上函数表示,把文本 text 绘制在给定的矩形 rectangle 中,其中 boundingRect 用于指示
包围文本的边框矩形,flags 用于指示文本的一些属性,flags 只能取下表中所列枚举的按
位 OR 值.
所属枚举 | 取值 |
---|---|
Qt::AlignmentFlag | Qt::AlignLeft; Qt::AlignRight; Qt::AlignTop; Qt::AlignBottom;Qt::AlignCenter; Qt::AlignHCenter;Qt::AlignVCenter Qt::AlignJustify描述文本的对齐方式 |
Qt::TextFlag该枚举的某些取值仅在打印环境下才有意义。 | Qt::TextDontClip; //若不能在给定的范围内显示,则会在外面打印Qt::TextSingleLine; //把所有空白视为空格,并只打印一行。Qt::TextExpandTabs; //使 U+0009(即 ASCII tab)移至下一个制表符。Qt::TextShowMnemonic; //把字符串"&S"显示为 S。Qt::TextWordWrap; //在合适的位置换行,比如单词的边界处。 |
示例
class B : public QWidget
{
public:
B(QWidget *p1 = 0) : QWidget(p1) {}
void paintEvent(QPaintEvent *e)
{
QPainter pr(this);
QBrush bs(QColor(1, 188, 1));
pr.setBrush(bs);
QFont f;
f.setPointSize(22);
pr.setFont(f); // 设置字体
QRectF r1(55, 55, 55, 77);
QRectF r2(55, 55, 177, 99); // 绘制矩形,注意绘制顺序。
pr.drawRect(r2);
pr.drawRect(r1);
pr.drawText(r1, Qt::TextShowMnemonic | Qt::TextWordWrap, "F&AaaFF ddd", &r2);
pr.drawText(QPointF(55, 55), "FFFFF\n DD");
pr.drawStaticText(QPointF(155, 55), QStaticText("XXX"));
}
};
int main(int a, char *b[])
{
QApplication c(a, b);
B w;
w.resize(444, 333);
w.show();
return c.exec();
}
学习《Qt5.10 GUI完全参考手册》