2013-10-10 5 views
1

Est-il possible de dessiner une forme de tarte sans bordure à l'arc, mais avec des bordures en ligne droite? Je joins une photo ci-dessous:drawPie() avec des bordures personnalisées

Actuellement j'ai mis en œuvre ce en appelant d'abord appeler drawPie() avec painter.setPen(QtCore.Qt.NoPen), puis plus tard en utilisant QLineF pour dessiner les lignes séparément en fonction du centre et des angles de la forme circulaire. Mais le problème est que la position de la ligne ne se synchronise pas avec la forme de la tarte si les angles ne sont pas des multiples de 90. Attacher une autre image montrant le problème.

enter image description here

est-il un moyen simple/élégante de le faire? Merci!

Répondre

0

Si l'on suppose votre commande Pie est un sous-classé QGraphicsRectItem, vous pouvez essayer quelque chose comme ceci:

class CustomPie(QtGui.QGraphicsRectItem): 

    angle = 2000 

    def paint(self, painter, option, widget): 

     # Create the path to draw the lines 
     path = QtGui.QPainterPath() 
     path.moveTo(self.rect().width()/2, self.rect().height()/2) 
     path.lineTo(self.rect().width(), self.rect().height()/2) 
     path.arcMoveTo(self.rect(), self.angle/16) # arcMoveTo in degrees 
     path.lineTo(self.rect().width()/2, self.rect().height()/2) 

     # draw a pie with no Pen 
     painter.setPen(QtGui.QPen(QtCore.Qt.NoPen)) 
     painter.setBrush(QtGui.QBrush(QtCore.Qt.lightGray)) 
     painter.drawPie(self.rect(), 0, self.angle) 

     # Draw the path with a custom Pen 
     painter.setPen(QtGui.QPen(QtCore.Qt.black, 2)) 
     painter.drawPath(path) 

Ici, nous outrepasser paint pour dessiner une tarte et un chemin (en fait tout à fait similaire à votre propre méthode). Vous devrez également remplacer __init__ (l'angle d'un attribut de classe n'est probablement pas ce que vous voulez), mais c'est l'idée.

+0

Merci Yoann! J'ai essayé votre méthode mais j'ai rencontré le même problème quand il s'agit d'angles qui ne sont pas multiples de 90. J'ai fini par appeler drawPie() avec un pinceau solide, et peindre un cercle blanc sur la bordure externe en utilisant QPainterPath pour le faire disparaître. –

Questions connexes