2012-08-07 18 views
6

Estoy creando un formulario con algunos widgets QTextEdit.¿QWidget como QTextEdit que ajusta su altura automáticamente a su contenido?

La altura predeterminada del QTextEdit excede una sola línea de texto y como la altura del contenido excede la altura del QTextEdit, crea una barra de desplazamiento para desplazar el contenido.

Me gustaría sobrescribir este comportamiento para crear un QTextEdit que prefiera ajustar su altura a su contenido. Esto significa que la altura predeterminada sería una línea y que al envolver o ingresar una nueva línea, QTextEdit aumentaría su altura automáticamente. Siempre que la altura del contenido exceda la altura del QTextEdit, este último no debería crear una barra de desplazamiento sino simplemente aumentar su altura.

¿Cómo puedo hacer esto? Gracias.

Respuesta

6

Esto es casi exactamente igual que una pregunta contesto el otro día acerca de hacer un QTextEdit ajustar su altura en respuesta a los cambios de contenido: PySide Qt: Auto vertical growth for TextEdit Widget

estoy respondiendo en lugar de marcar un duplicado como sospecho que su posible que desee una variación en esto. Avísame si quieres que expanda esta respuesta:

La otra pregunta tiene varias partes. Aquí está el extracto del widget creciente altura:

class Window(QtGui.QDialog): 

    def __init__(self): 
     super(Window, self).__init__() 
     self.resize(600,400) 

     self.mainLayout = QtGui.QVBoxLayout(self) 
     self.mainLayout.setMargin(10) 

     self.scroll = QtGui.QScrollArea() 
     self.scroll.setWidgetResizable(True) 
     self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) 
     self.mainLayout.addWidget(self.scroll) 

     scrollContents = QtGui.QWidget() 
     self.scroll.setWidget(scrollContents) 

     self.textLayout = QtGui.QVBoxLayout(scrollContents) 
     self.textLayout.setMargin(10) 

     for _ in xrange(5): 
      text = GrowingTextEdit() 
      text.setMinimumHeight(50) 
      self.textLayout.addWidget(text) 


class GrowingTextEdit(QtGui.QTextEdit): 

    def __init__(self, *args, **kwargs): 
     super(GrowingTextEdit, self).__init__(*args, **kwargs) 
     self.document().contentsChanged.connect(self.sizeChange) 

     self.heightMin = 0 
     self.heightMax = 65000 

    def sizeChange(self): 
     docHeight = self.document().size().height() 
     if self.heightMin <= docHeight <= self.heightMax: 
      self.setMinimumHeight(docHeight) 
+0

Esto es exactamente lo que necesitaba. Sin embargo, no me había encontrado con mis términos de búsqueda. ¡Gracias! – Benjamin

+0

También (no pude ver eso en la otra publicación) Tuve que conectar lo siguiente para ajustar la altura de QTextEdit a su documento cuando se cambia el tamaño de la primera: 'self.document(). DocumentLayout(). DocumentSizeChanged.connect (self.wrapHeightToContents) '. – Benjamin

+0

Si ves en mi ejemplo, estoy usando una señal diferente más arriba. No necesitaba ninguna otra conexión – jdi

4

el siguiente código establece un widget QTextEdit a la altura del contenido:

# using QVBoxLayout in this example 
grid = QVBoxLayout() 
text_edit = QTextEdit('Some content. I make this a little bit longer as I want to see the effect on a widget with more than one line.') 

# read-only 
text_edit.setReadOnly(True) 

# no scroll bars in this example 
text_edit.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
text_edit.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
text_edit.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) 

# you can set the width to a specific value 
# text_edit.setFixedWidth(400) 

# this is the trick, we nee to show the widget without making it visible. 
# only then the document is created and the size calculated. 

# Qt.WA_DontShowOnScreen = 103, PyQt does not have this mapping?! 
text_edit.setAttribute(103) 
text_edit.show() 

# now that we have a document we can use it's size to set the QTextEdit's size 
# also we add the margins 
text_edit.setFixedHeight(text_edit.document().size().height() + text_edit.contentsMargins().top()*2) 

# finally we add the QTextEdit to our layout 
grid.addWidget(text_edit) 

espero que esto ayude.

+1

Este es un truco muy interesante, pero parte de mí piensa que debe haber alguna otra forma. Pero la otra parte de mí se da cuenta de que esta puede ser la mejor manera en la práctica, ya que no tiene que calcular anchos de cuadro y demás, y resolver todo eso. – neuronet

+0

Técnicamente 'contentsMargins(). Top() + contentsMargins(). Bottom()' es más correcto que 'contentsMargins(). Top() * 2' aunque estos valores suelen ser los mismos. –

Cuestiones relacionadas