Y at-il un moyen de faire drawText () mettre à jour le rect bondissant d'un QPicture?

StackOverflow https://stackoverflow.com/questions/792521

  •  16-09-2019
  •  | 
  •  

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.)

Était-ce utile?

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.

QPainter.boundingRect

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 ...)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top