¿Hay una manera de hacer drawText () actualizar rect saltando de un QPicture?

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

  •  16-09-2019
  •  | 
  •  

Pregunta

Sobre la base de un QPicture debe actualizar su rect delimitador. De esta manera:

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

Pero si dibujo texto en él, la delimitación rect no se actualiza:

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

Obviamente, no se actualiza la delimitación rect.

¿Hay una manera de hacer que repsect texto elaborado o tengo que hacerlo manualmente? (No es demasiado difícil, pero espero que Qt me puede ayudar aquí.)

¿Fue útil?

Solución

Tome un vistazo a estos métodos de sobrecarga, en el que debe especificar el rectángulo envolvente después de que el parámetro de texto (que es aparentemente diferente que el rectángulo en la posición del primer argumento):

  

Señala el texto dado en el   proporcionado rectángulo de acuerdo con la   banderas especificadas. El boundingRect (si   no nulo) se establece en la que la   rectángulo que bordea debe estar en orden   para encerrar todo el texto.

QPainter.drawText (1) , QPainter.drawText (2)

Actualización:

Parece que si quieres generar un rectángulo delimitador para el método drawText () por adelantado, que acaba de llamar el método boundingRect () en QPainter, que hace lo siguiente:

  

Devuelve el rectángulo delimitador de la   el texto tal y como aparecerá cuando se dibuja   en el interior del rectángulo dado con el   especificados banderas utilizando la actualidad   fuente set (); es decir la función que le dice   donde la función drawText () se   dibujar cuando se les da los mismos argumentos.

     

Si el texto no encaja dentro de la   rectángulo dado usando el especificado   banderas, la función devuelve el   requerido rectángulo.

QPainter.boundingRect

I ligado a BoundingRect con salida QRectF, pero la información se aplica a las otras versiones también.

Así que, básicamente, pasar el resultado de QPainter.boundingRect () en el parámetro boundingRect del método QPainter.drawText () (el segundo argumento QRect).

Actualización 2:

Me DISCULPO PROFUSAMENTE por ser tan maldita densa. Olvidé que drawText funciona de forma diferente en PyQt que en Qt. El rectángulo delimitador es devuelto por la función drawText (no aprobada en como Qt) y, además, tiene que especificar banderas de alineación antes de obtener una delimitación rectángulo dado de nuevo a usted. (Incluso incluí la P.End () de acuerdo con el comentario de 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()

Aquí está la salida:

  

PyQt4.QtCore.QRect (100, 103, 20, 14)

     

PyQt4.QtCore.QRect (0, 0, 0, 0)

Por lo tanto, parece que tendrá que establecer el rectángulo delimitador a sí mismo, aunque al menos se devuelve a usted por el método de salida del drawText () al pasar de banderas.

Esto no parecer un comportamiento ideal, que tendría que establecer el rectángulo envolvente usted mismo. Espero que alguien más tiene la respuesta que está buscando, pero sospecho que es posible que desee informar de este error.

Otros consejos

La pintura no cambia el tamaño de algo en Qt. La principal razón es la siguiente:

  • Un componente tiene que pintarse
  • La pintura desencadena un cambio de tamaño
  • El cambio de tamaño desencadena la pintura -> bucle sin fin

Así que el cambio de tamaño tiene que ocurrir durante la fase de diseño. Después de eso, los límites no deben cambiar.

Para resolver el problema, utilice QFontMetric de averiguar el tamaño de su texto va a ser durante o cerca de la construcción de su imagen y luego cambiar su tamaño en consecuencia.

[EDIT] Hm ... tratar de colgar () antes de solicitar la delimitación rect. Si funciona, se ha encontrado un error (no se puede ver una razón por la delimitación rect no debería existir a medida que agrega elementos ...)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top