Cambiar el tamaño de QTextEdit de QT para que coincida con la altura del texto: maximumViewportSize ()

Estoy tratando de usar un widget QTextEdit dentro de un formulario que contiene varios widgets QT. El formulario en sí se encuentra dentro de un QScrollArea que es el widget central de una ventana. Mi intención es que cualquier desplazamiento necesario se lleve a cabo en el QScrollArea principal (en lugar de dentro de cualquier widget), y cualquier widget dentro cambiará automáticamente su altura para contener su contenido.

Intenté implementar el cambio de tamaño automático de altura con un QTextEdit, pero me encontré con un problema extraño. Creé una subclase de QTextEdit y reimplementé sizeHint () de esta manera:

QSize OperationEditor::sizeHint() const {
  QSize sizehint = QTextBrowser::sizeHint();
  sizehint.setHeight(this->fitted_height);
  return sizehint;
}

this-> fits_height se mantiene actualizado a través de esta ranura que está conectada a la señal "contentChanged ()" de QTextEdit:

void OperationEditor::fitHeightToDocument() {
      this->document()->setTextWidth(this->viewport()->width());
      QSize document_size(this->document()->size().toSize());
      this->fitted_height = document_size.height();
      this->updateGeometry();
}

La política de tamaño de la subclase QTextEdit es:

this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);

Tomé este enfoque después de leeresta publicación.

Aquí está mi problema:

A medida que QTextEdit cambia de tamaño gradualmente para llenar la ventana, deja de crecer y comienza a desplazarse dentro de QTextEdit, sin importar la altura que devuelve sizeHint (). Si inicialmente tengo sizeHint () devuelve un número constante grande, entonces QTextEdit es muy grande y está muy bien contenido dentro del QScrollArea externo, como era de esperar. Sin embargo, si sizeHint ajusta gradualmente el tamaño de QTextEdit en lugar de hacerlo realmente grande para comenzar, entonces se completa cuando llena la ventana actual y comienza a desplazarse en lugar de crecer.

He rastreado este problema para que, sin importar lo que devuelva mi sizeHint (), nunca cambiará el tamaño del QTextEdit por encima del valor devuelto por maximumViewportSize (), que se hereda de QAbstractScrollArea. Tenga en cuenta que este no es el mismo número que viewport () -> maximumSize (). No puedo entender cómo establecer ese valor.

Al observar el código fuente de QT, maximumViewportSize () está devolviendo "el tamaño de la ventana gráfica como si las barras de desplazamiento no tuvieran un rango de desplazamiento válido". Este valor se calcula básicamente como el tamaño actual del widget menos (2 * ancho de cuadro + márgenes) más cualquier ancho / alto de barra de desplazamiento. Esto no tiene mucho sentido para mí, y no está claro para mí por qué ese número se usaría en cualquier lugar de una manera que sustituya la implementación sizeHint () de la subclase. Además, parece extraño que el único entero "frameWidth" se use para calcular tanto el ancho como la altura.

¿Alguien puede arrojar algo de luz sobre esto? Sospecho que mi pobre comprensión del motor de diseño de QT es la culpa aquí.

Editar: después de publicar esto inicialmente, tuve la idea de reimplementar maximumViewportSize () para devolver lo mismo que sizeHint (). Desafortunadamente, esto no funcionó ya que todavía tengo el mismo problema.

Respuestas a la pregunta(2)

Su respuesta a la pregunta