绘制圆形drawEllipse

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

1. 基本重载形式

1.1 drawEllipse(const QRectF &rect)
  • 功能:在指定矩形区域内绘制椭圆(矩形为椭圆的外切矩形)。
  • 参数:QRectF对象(浮点型坐标和尺寸)。
  • 示例
    QPainter painter(this);
    QRectF rect(10.0, 10.0, 100.0, 50.0); // 水平椭圆(宽大于高)
    painter.drawEllipse(rect);
    
1.2 drawEllipse(const QRect &rect)
  • 功能:使用整数坐标的矩形区域绘制椭圆。
  • 参数:QRect对象(整型坐标和尺寸)。
  • 示例
    QRect rect(10, 10, 100, 100); // 正方形区域内绘制圆形
    painter.drawEllipse(rect);
    
1.3 drawEllipse(int x, int y, int width, int height)
  • 功能:通过左上角坐标和宽高直接指定椭圆的外切矩形。
  • 参数:整数坐标和尺寸。
  • 示例
    painter.drawEllipse(10, 10, 100, 50); // 与QRect版本等价
    

2. 绘制圆形

当矩形区域为正方形时,椭圆会退化为圆形:

// 绘制标准圆形(宽高相等)
painter.drawEllipse(10, 10, 100, 100); // 圆心(60,60),半径50

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.drawEllipse(10, 10, 100, 50);

4. 绘制椭圆弧

若需绘制椭圆的一部分(圆弧),可使用drawArc()函数:

// 绘制椭圆弧(从90度开始,逆时针旋转180度)
QRectF arcRect(10, 10, 100, 50);
int startAngle = 90 * 16;   // 起始角度(90度,单位为1/16度)
int spanAngle = 180 * 16;   // 跨度角度(180度)
painter.drawArc(arcRect, startAngle, spanAngle);

5. 应用场景

  • 绘制圆形按钮、图标。
  • 实现饼图、雷达图等数据可视化。
  • 创建装饰性图形元素(如气泡、徽章)。

总结

重载形式 适用场景
drawEllipse(const QRectF&) 浮点型坐标的椭圆
drawEllipse(const QRect&) 整型坐标的椭圆
drawEllipse(int, int, int, int) 直接指定坐标和尺寸的椭圆
drawArc() 绘制椭圆的一部分(圆弧)

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

绘制弧线drawArc

QPainter::drawArc() 是 Qt 框架中用于绘制圆弧的核心方法,属于 QPainter 类的形状绘制函数。以下是其详细介绍:

基本定义

void QPainter::drawArc(int x, int y, int width, int height, int startAngle, int spanAngle);
void QPainter::drawArc(const QRectF &rect, int startAngle, int spanAngle);
  • 参数
    • x, y, width, heightrect:定义圆弧所在的外接矩形。
    • startAngle:起始角度(单位:1/16 度),0 表示 3 点钟方向,正值逆时针旋转。
    • spanAngle:弧长角度(单位:1/16 度),正值逆时针绘制,负值顺时针绘制。

角度单位说明

  • 1 度 = 16 个单位:例如,90 度需写为 90 * 16
  • 角度方向:逆时针为正,顺时针为负。

重载函数

  1. 基于整数坐标
    drawArc(int x, int y, int width, int height, int startAngle, int spanAngle);
    
  2. 基于浮点坐标
    drawArc(const QRectF &rect, int startAngle, int spanAngle);
    
  3. 结合 QRect 使用
    QRect rect(x, y, width, height);
    painter.drawArc(rect, startAngle, spanAngle);
    

常见用法示例

1. 绘制四分之一圆(90 度)
QPainter painter(this);
// 绘制从 0 度开始的 90 度圆弧(右上角)
painter.drawArc(50, 50, 100, 100, 0, 90 * 16);
2. 绘制整圆(360 度)
// 方法一:从 0 度开始绘制 360 度
painter.drawArc(50, 50, 100, 100, 0, 360 * 16);

// 方法二:使用负值顺时针绘制
painter.drawArc(50, 50, 100, 100, 0, -360 * 16);
3. 绘制椭圆弧
// 椭圆的外接矩形(宽高不同)
painter.drawArc(50, 50, 200, 100, 0, 180 * 16); // 上半椭圆
4. 使用 QRectF 绘制浮点精度圆弧
QRectF rect(50.5, 50.5, 99.5, 99.5);
painter.drawArc(rect, 45 * 16, 270 * 16); // 从 45 度开始的 270 度弧

注意事项

  1. 角度与方向

    • 起始角度 startAngle 决定圆弧的起点位置。
    • 弧长角度 spanAngle 的正负决定绘制方向(正:逆时针,负:顺时针)。
  2. 画笔与填充

    • 圆弧由当前画笔(QPen)的宽度和样式决定轮廓。
    • 圆弧默认不填充,如需填充可使用 drawChord()drawPie()
  3. 坐标系

    • 坐标原点 (0, 0) 通常是部件的左上角。

相关函数

  • drawChord():绘制带弦的圆弧(闭合扇形)。
  • drawPie():绘制扇形(圆弧 + 两条半径)。
  • drawEllipse():绘制完整椭圆或圆。

示例代码片段

void MyWidget::paintEvent(QPaintEvent *event) {
    QPainter painter(this);
    
    // 设置画笔样式
    painter.setPen(QPen(Qt::blue, 2, Qt::DashLine));
    
    // 绘制不同圆弧
    painter.drawArc(50, 50, 100, 100, 0, 180 * 16);       // 上半圆
    painter.drawArc(200, 50, 100, 100, 180 * 16, 180 * 16); // 下半圆
    
    // 绘制顺时针圆弧
    painter.setPen(Qt::red);
    painter.drawArc(50, 200, 100, 100, 0, -90 * 16);     // 顺时针 90 度
}

通过 drawArc(),你可以灵活绘制各种圆弧形状,适用于图表、仪表盘、自定义控件等场景。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐