Qt自定义控件(5)——QPainter画家:绘制形状drawEllipse、drawArc
·
绘制圆形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, height或rect:定义圆弧所在的外接矩形。startAngle:起始角度(单位:1/16 度),0 表示 3 点钟方向,正值逆时针旋转。spanAngle:弧长角度(单位:1/16 度),正值逆时针绘制,负值顺时针绘制。
角度单位说明
- 1 度 = 16 个单位:例如,90 度需写为
90 * 16。 - 角度方向:逆时针为正,顺时针为负。
重载函数
- 基于整数坐标:
drawArc(int x, int y, int width, int height, int startAngle, int spanAngle); - 基于浮点坐标:
drawArc(const QRectF &rect, int startAngle, int spanAngle); - 结合
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 度弧
注意事项
-
角度与方向:
- 起始角度
startAngle决定圆弧的起点位置。 - 弧长角度
spanAngle的正负决定绘制方向(正:逆时针,负:顺时针)。
- 起始角度
-
画笔与填充:
- 圆弧由当前画笔(
QPen)的宽度和样式决定轮廓。 - 圆弧默认不填充,如需填充可使用
drawChord()或drawPie()。
- 圆弧由当前画笔(
-
坐标系:
- 坐标原点
(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(),你可以灵活绘制各种圆弧形状,适用于图表、仪表盘、自定义控件等场景。
更多推荐
所有评论(0)