简介: qt绘画扇形drawPie(),绘画出弧线; 和由三角形的长度计算出角度,利用反三角函数qAcos()

[TOC]


本文初发于 “偕臧的小站“,同步转载于此。


问题背景:

在绘画进度条控件中,进度滑块当处于一开始和快完成,有弧度部分的时候,想要看的过程比较自然,就要自己手动填充这一部分”梯形(腰是两个段圆弧)”;而一开始想到的居然是:直接求直线于弧线(圆角矩形的弧线部分)的交点的函数,我觉得应该是没有的。


解决方法:

将**”腰是圆弧梯形”**拆分为一个两个圆弧和一个(标准)等腰梯形来进行拆分,从而进行填。

其中需要计算角度

绘画扇形drawPie():

void QPainter::drawPie(const QRect &, int a, int alen)
参数1: 圆弧的圆心所处于矩形
参数2: 圆弧的开始始的角度°(单位1/16度)
参数3: 圆弧的转动的角度°(单位1/16度)

实际使用,注意其单位是1/16角度,而不是弧度

p->drawPie(topPointRect,41 * 16, (90 - 41) * 16);

反三角计算角度qAcos():

由三角形的边计算角度;需要包含头文件

#include <QtMath>

另外一个计算角度的函数

qreal qAcos(qreal v)
Returns the arccosine of v as an angle in radians. Arccosine is the inverse operation of cosine.
参数: 直角边/斜边 (注意用double)
返回结果: 是弧度为单位

使用:

qreal raw = qAcos(30 * 1.0 / 40);   //=41.4096弧度

弧度和角度转换公式:

弧度 = 角度 * π / 180

π所对应的宏为:

//M_PI	The ratio of a circle's circumference to diameter, π

绘画上图的黑色圆弧代码:

qreal raw = qAcos(30 * 1.0 / 40);
int startRadius = raw * 180 / M_PI;
p->drawPie(topPointRect,startRadius * 16, (90 - startRadius) * 16);

最后的效果:

如图:然后同理,只需要将左侧的两个角都这样计算,然后同样填充蓝色,即可以做到圆角处的完美(当进度增加时候,加载想的自然)