¿Un QWidget como QTextEdit que ajusta su altura automáticamente a su contenido?

Estoy creando un formulario con algunos widgets QTextEdit.

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

Me gustaría anular 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 ajustar o ingresar una nueva línea, QTextEdit boostía su altura automáticamente. Cuando la altura del contenido excede la altura de QTextEdit, esta última no debe crear una barra de desplazamiento, sino simplemente boost la altura.

¿Cómo puedo hacer esto? Gracias.

Esto es casi exactamente como una pregunta que respondí el otro día acerca de hacer un ajuste QTextEdit su altura en respuesta a los cambios de contenido: PySide Qt: Crecimiento vertical automático para TextEdit Widget

Estoy respondiendo en lugar de marcar un duplicado, ya que sospecho que es posible que desee una variación en esto. Déjame saber si quieres que amplíe esta respuesta:

La otra pregunta tenía múltiples partes. Aquí está el extracto del widget de altura creciente:

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) 

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.