我想让文本标签(百分比)在每个饼图切片中居中。它目前适用于两个象限:
我做错了什么?
void PieChartWidget::paintEvent(QPaintEvent *) {
QPainter painter(this);
QRectF size;
painter.setPen(QPen(Qt::black, 2));
if (this->height() > this->width()) {
size = QRectF(5, 5, this->width() - 10, this->width() - 10);
} else {
size = QRectF(5, 5, this->height() - 5, this->height() - 10);
}
double sum = 0.0, startAng = 0.0;
double angle, endAng;
double percent;
for (int i = 0; i < qvValues.size(); i++) {
sum += qvValues[i];
}
for (int i = 0; i < qvValues.size(); i++) {
percent = qvValues[i] / sum;
angle = percent * 360.0;
endAng = startAng + angle;
painter.setBrush(qvColors[i]);
painter.drawPie(size, static_cast<int>(startAng * 16),
static_cast<int>(angle * 16));
startAng = endAng;
if (percent != 0) {
double draw_x = width() / 2 +
cos(PI * (endAng / 180.0 - angle / 360.0)) * this->width() / 4.0;
double draw_y = height() / 2 +
sin(PI * (endAng / 180.0 - angle / 360.0)) * this->width() / 4.0;
painter.drawText(draw_x, draw_y, QString::number(percent * 100) + "%");
}
}
}
在这一行:
painter.drawText(this->width()/4,this->height(), QString::number(percent*100)+"%");
你似乎每次都在同一个地方画百分比。你确实成功地绘制了每个部分的百分比,它们只是每次都被绘制在同一个地方。尝试将其更改为:
painter.drawText(double(i + 1) * this->width()/4,this->height(), QString::number(percent*100)+"%");
你会明白我的意思。通过将 x 值乘以某个变化的值,每个绘制文本的 x 位置将发生变化,因此您将能够看到绘制的不同百分比。
如果您希望它在每个象限中绘制,那么您的代码可能如下所示:
# define PI 3.14159265358979323846
...
double draw_x = this->width / 2.0 + cos(PI * (end_angle / 180.0 - angle / 360.0)) * this->width / 4.0;
double draw_y = this->height / 2.0 - sin(PI * (end_angle / 180.0 - angle / 360.0)) * this->width / 4.0;
painter.drawText(draw_x, draw_y, QString::number(percent*100)+"%");
基本上,上面代码中发生的事情是计算每个切片中间的 x 和 y 坐标。然后,我正在绘制这些位置的百分比。
我是一名优秀的程序员,十分优秀!