¿Hay una manera de hacer drawText () actualizar rect saltando de un QPicture?
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í.)
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.
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 ...)