【笔记】QT2D绘图详解(直线,矩形,椭圆,折线,路径,文本)

绘图基础

  • 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 绘制图形的步骤

  1. 创建一个 QPainter 对象
  2. 调用QPainter::begin(QPaintDevice *);指定绘图设备并开始绘制,此步骤也可在 QPainter
    的构造函数中完成。注意:每次调用begin()函数都会把QPainter 的设置重置为默认值
  3. 调用 QPainter 的成员函数绘制图形,调用 QPainter::end()结束绘制
  4. 若绘制设备是一个 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); //中心位置
  • 其余位置和大小函数
  1. void setRect(qreal x, qreal y, qreal width, qreal height);
    设置矩形左上角坐标为(x,y),宽为 width,高为 height
  2. void setCoords(qreal x1, qreal y1, qreal x2, qreal y2);
    设置矩形左上角的坐标为(x1,y1),右下角坐标为(x2,y2);
  3. void getRect(qreal *x, qreal *y, qreal *width, qreal *height) const;
    把矩形的左上角坐标提取到(x,y)中,宽度提取到 width,高度提取到 height 中。
  4. void getCoords(qreal *x1, qreal *y1, qreal *x2, qreal *y2) const;
    把矩形的左上角坐标提取到(x1,y1)中,左上角坐标提取到(x2,y2)中。
    在这里插入图片描述
判断矩形与点
  1. 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。
  2. 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。
  1. 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)) ;
矩形的交集和并集
  1. QRectF intersected(const QRectF &rectangle) const
    返回该矩形与矩形 rectangle 的交集(即两矩形的重叠区域),注意:r1.intersected(r2)相当
    于 r1&r2。
  2. bool intersects(const QRectF &rectangle) const; //若该矩形与矩形 rectangle 相交,则返回 true。
  3. 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)绘制多个点,QPolygonF
  • drawConvexPolygon(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;转换为整型版本的 QPolygon
  • bool 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()函数多次绘制它
    们。一个路径就是由多个矩形、椭圆、线条等图形组成的对象,路径可以是封闭的也可以
    是非封闭的。
  • 图形的绘制步骤:路径始终从当前点开始绘制
    1. 创建 QPaiterPath 对象
    2. 使用 moveTo 把当前点移至需要绘制图形的开始位置
    3. 使用 lintTo()、arcTo()等函数绘制直线、弧等图形,还可使用 addRect()、addEllipse()
      等函数把封闭子路径添加到路径
    4. 使用 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 &region)添加区域
  • 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 是控制点。添加曲线后,当前点更新为点 endPoint
  • void 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::AlignmentFlagQt::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完全参考手册》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值