Come avere il testo centrato all’interno di ogni fetta di un grafico a torta?

Mi piacerebbe ottenere le etichette di testo (percentuali) centrate all’interno di ogni fetta di torta. Attualmente funziona un po ‘per due dei quadranti:

immagine dello schermo

Che cosa sto facendo di sbagliato?

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(startAng * 16), static_cast(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) + "%"); } } } 

Su questa linea:

 painter.drawText(this->width()/4,this->height(), QString::number(percent*100)+"%"); 

Sembri disegnare la percentuale nello stesso posto ogni volta. Si disegna con successo la percentuale per ogni sezione, vengono disegnate nello stesso posto ogni volta. Prova a cambiarlo in questo modo:

 painter.drawText(double(i + 1) * this->width()/4,this->height(), QString::number(percent*100)+"%"); 

E vedrai cosa intendo. Moltiplicando il valore x di un valore variabile, la posizione x di ogni testo disegnato cambierà, e quindi sarai in grado di vedere le diverse percentuali disegnate.

Se vuoi che sia disegnato in ogni quadrante, il tuo codice potrebbe apparire in questo modo:

 # 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)+"%"); 

Fondamentalmente, quello che sta succedendo nel codice sopra è che sto calcolando le coordinate xey nel mezzo di ogni slice. Quindi, sto disegnando le percentuali in quelle posizioni.