Y at-il un moyen de faire drawText () mettre à jour le rect bondissant d'un QPicture?
Question
Dessin sur un QPicture
devrait mettre à jour son rect englobante. Comme ceci:
>>> picture = QPicture()
>>> painter = QPainter(picture)
>>> picture.boundingRect()
QRect(0,0,0,0)
>>> painter.drawRect(20,20,50,50)
>>> picture.boundingRect()
QRect(20,20,50,50)
Mais si je dessine le texte à ce sujet, le rect bondissant est pas mis à jour:
>>> picture = QPicture()
>>> painter = QPainter(picture)
>>> picture.boundingRect()
QRect(0,0,0,0)
>>> painter.drawText(10,10, "Hello, World!")
>>> picture.boundingRect()
QRect(0,0,0,0)
De toute évidence, il ne met pas à jour le rect bondissant.
Y at-il un moyen de le rendre repsect texte élaboré ou dois-je faire manuellement? (Pas trop dur, mais j'espère que Qt peut me aider ici.)
La solution
Jetez un oeil à ces méthodes de surcharge, où vous devez spécifier le rectangle de sélection après le paramètre de texte (qui est apparemment différente de celle du rectangle dans la position du premier argument):
Dessine le texte donné dans le rectangle fourni en fonction de la drapeaux spécifiés. Le boundingRect (si non nul) est réglé sur la ce que la rectangle de délimitation doit être en ordre pour entourer le texte.
QPainter.drawText (1) , QPainter.drawText (2)
Mise à jour:
Il apparaît si vous voulez générer un rectangle de délimitation de la méthode à l'avance, vous appelez simplement la méthode boundingRect () drawText () sur QPainter qui effectue les opérations suivantes:
Retourne le rectangle de délimitation de la texte tel qu'il apparaît quand il est dessiné à l'intérieur du rectangle donné avec le drapeaux spécifiées en utilisant le moment la police de set (); i.e. la fonction vous dit où la fonction drawText () sera tirer lorsqu'il est administré les mêmes arguments.
Si le texte ne correspond pas à la rectangle donné en utilisant le spécifié drapeaux, la fonction retourne la rectangle nécessaire.
I lié à boundingRect avec sortie QRectF, mais les informations s'appliquent aux autres versions.
Donc, fondamentalement, passer le résultat de QPainter.boundingRect () dans le paramètre de la méthode boundingRect QPainter.drawText () (le second argument QRect).
Mise à jour 2:
Je me confonds en excuses pour être si dense sacrément. J'ai oublié que drawText fonctionne différemment dans PyQt que dans Qt. Le rectangle de délimitation est Renvoyé par la fonction drawText (pas passé dans comme Qt) et en plus, vous devez spécifier des options d'alignement avant que vous obtenez un rectangle de sélection donné à vous. (J'ai même inclus le p.end () selon le commentaire d'Aaron Digulla):
pic = Qt.QPicture()
p = QtGui.QPainter(pic)
brect = p.drawText(10,10,200,200, QtCore.Qt.AlignCenter, "blah")
p.end()
print brect
print pic.boundingRect()
Voici la sortie:
PyQt4.QtCore.QRect (100, 103, 20, 14)
PyQt4.QtCore.QRect (0, 0, 0, 0)
Il semble donc que vous devrez définir le contour rectangle vous-même, mais au moins il vous est retourné par la sortie de la méthode drawText () lors du passage dans les drapeaux.
Cela ne semble pas un comportement idéal, que vous devez définir la délimitation même rectangle. J'espère que quelqu'un d'autre a la réponse que vous cherchez, mais je soupçonne que vous pouvez signaler ce bug.
Autres conseils
La peinture ne change pas la taille de quelque chose dans Qt. La principale raison est la suivante:
- Un composant doit se peindre
- La peinture déclenche une Redimensionner
- Redimensionnement déclenche la peinture -> boucle sans fin
Ainsi, le redimensionnement doit se produire au cours de la phase de mise en page. Après cela, les limites ne devraient pas changer.
Pour résoudre votre problème, utilisez QFontMetric pour comprendre la taille de votre texte va être pendant ou près de la construction de votre image, puis la redimensionner en conséquence.
[EDIT] Hm ... essayer d'appeler fin () avant de demander le rect de délimitation. Si cela fonctionne, vous avez trouvé un bug (ne peut pas voir une raison pour laquelle le rect bondissant ne devrait pas exister en tant que vous ajoutez des éléments ...)