Qt自定义控件(4)——QPainter画家:绘制形状drawLine、drawRect

绘制线条drawLine

在Qt中,QPainter的drawLine()函数用于绘制直线段,是绘图中最基础的操作之一。以下是关于drawLine()的详细介绍:

1. 基本重载形式

1.1 drawLine(int x1, int y1, int x2, int y2)
  • 功能:绘制从点(x1, y1)到点(x2, y2)的直线。
  • 参数:整数坐标点。
  • 示例
    QPainter painter(this);
    painter.drawLine(10, 10, 100, 100); // 从(10,10)到(100,100)的对角线
    
1.2 drawLine(const QLine &line)
  • 功能:通过QLine对象绘制直线。
  • 参数:QLine对象(存储起点和终点)。
  • 示例
    QLine line(10, 10, 100, 100);
    painter.drawLine(line);
    
1.3 drawLine(const QPoint &p1, const QPoint &p2)
  • 功能:通过两个QPoint对象绘制直线。
  • 参数:起点p1和终点p2
  • 示例
    QPoint start(10, 10);
    QPoint end(100, 100);
    painter.drawLine(start, end);
    

2. 浮点精度重载

2.1 drawLine(float x1, float y1, float x2, float y2)
  • 功能:使用浮点数坐标绘制直线(更高精度)。
  • 示例
    painter.drawLine(10.5f, 10.5f, 100.5f, 100.5f);
    
2.2 drawLine(const QLineF &line)
  • 功能:通过QLineF对象(浮点数坐标)绘制直线。
  • 示例
    QLineF lineF(10.5, 10.5, 100.5, 100.5);
    painter.drawLine(lineF);
    

3. 线宽与样式设置

通过QPen可以自定义线的宽度、颜色、样式(实线、虚线等):

QPainter painter(this);

// 创建画笔并设置属性
QPen pen(Qt::blue);        // 蓝色
pen.setWidth(2);           // 线宽2像素
pen.setStyle(Qt::DashLine); // 虚线样式

painter.setPen(pen);
painter.drawLine(10, 10, 100, 100);

4. 绘制多条线

若需绘制多条不连续的线,可使用drawLines()系列函数提高效率:

// 方法1:使用QLine数组
QLine lines[] = {
    QLine(10, 10, 100, 10),
    QLine(100, 10, 100, 100),
    QLine(100, 100, 10, 100),
    QLine(10, 100, 10, 10)
};
painter.drawLines(lines, 4); // 绘制4条线

// 方法2:使用QVector<QLine>
QVector<QLine> lineVector;
lineVector << QLine(10, 10, 100, 10) << QLine(100, 10, 100, 100);
painter.drawLines(lineVector);

5. 性能考虑

  • 绘制大量线条时,优先使用drawLines()而非多次调用drawLine()
  • 浮点坐标的绘制效率略低于整数坐标,但精度更高。

6. 应用场景

  • 绘制图形边框、网格线。
  • 实现折线图、坐标系等。
  • 作为复杂图形的基础组件(如多边形由多条线段组成)。

总结

重载形式适用场景
drawLine(int, int, int, int)整数坐标的简单直线
drawLine(const QLine&)使用QLine对象
drawLine(float, float, float, float)高精度浮点数坐标
drawLine(const QLineF&)使用浮点型QLineF对象
drawLines()系列批量绘制多条直线

通过结合QPen的属性设置,drawLine()可以满足各种线条绘制需求。

绘制矩形drawRect

在Qt中,QPainter的drawRect()函数用于绘制矩形,是绘图中常用的基础操作。以下是关于drawRect()的详细介绍:

1. 基本重载形式

1.1 drawRect(int x, int y, int width, int height)
  • 功能:绘制一个左上角位于(x, y),宽为width,高为height的矩形。
  • 参数:整数坐标和尺寸。
  • 示例
    QPainter painter(this); 
    painter.drawRect(10, 10, 100, 50); // 绘制矩形:左上角(10,10),宽100,高50
    
1.2 drawRect(const QRect &rect)
  • 功能:通过QRect对象绘制矩形。
  • 参数:QRect对象(存储左上角坐标和宽高)。
  • 示例
    QRect rect(10, 10, 100, 50);
    painter.drawRect(rect);
    

2. 浮点精度重载

2.1 drawRect(const QRectF &rect)
  • 功能:使用浮点数坐标绘制矩形(更高精度)。
  • 参数:QRectF对象(浮点型坐标和尺寸)。
  • 示例
    QRectF rectF(10.5, 10.5, 100.5, 50.5);
    painter.drawRect(rectF);
    

3. 线宽与样式设置

通过QPen可以自定义矩形边框的宽度、颜色、样式(实线、虚线等),通过QBrush可以填充矩形内部:

QPainter painter(this);

// 设置边框
QPen pen(Qt::blue);        // 蓝色边框
pen.setWidth(2);           // 线宽2像素
pen.setStyle(Qt::DashLine); // 虚线样式
painter.setPen(pen);

// 设置填充
QBrush brush(Qt::green, Qt::Dense3Pattern); // 绿色+密集点图案
painter.setBrush(brush);

// 绘制带边框和填充的矩形
painter.drawRect(10, 10, 100, 50);

4. 绘制多个矩形

若需绘制多个矩形,可使用drawRects()系列函数提高效率:

// 方法1:使用QRect数组
QRect rects[] = {
    QRect(10, 10, 50, 50),
    QRect(70, 10, 50, 50),
    QRect(10, 70, 50, 50),
    QRect(70, 70, 50, 50)
};
painter.drawRects(rects, 4); // 绘制4个矩形

// 方法2:使用QVector<QRect>
QVector<QRect> rectVector;
rectVector << QRect(10, 10, 50, 50) << QRect(70, 10, 50, 50);
painter.drawRects(rectVector);

5. 仅填充不绘制边框

若只需填充矩形内部(无边框),可使用fillRect()

// 填充矩形(无边框)
painter.fillRect(10, 10, 100, 50, Qt::green);

6. 应用场景

  • 绘制UI组件(按钮、文本框等)的背景。
  • 创建图形界面的布局框架。
  • 实现柱状图、进度条等可视化元素。

总结

重载形式适用场景
drawRect(int, int, int, int)整数坐标的矩形
drawRect(const QRect&)使用QRect对象
drawRect(const QRectF&)浮点型坐标的高精度矩形
drawRects()系列批量绘制多个矩形
fillRect()仅填充矩形内部(无边框)

通过结合QPen和QBrush的属性设置,drawRect()可以实现各种矩形的绘制需求,包括空心、实心、带图案填充等效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸥梨菌Honevid

心想事成

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值