Redimensionando o QTextEdit do QT para corresponder à altura do texto: maximumViewportSize ()

Estou tentando usar um widget QTextEdit dentro de um formulário que contém vários widgets QT. O próprio formulário fica dentro de um QScrollArea, que é o widget central de uma janela. Minha intenção é que qualquer rolagem necessária ocorra na QScrollArea principal (em vez de dentro de quaisquer widgets), e quaisquer widgets internos redimensionarão automaticamente sua altura para manter seu conteúdo.

Tentei implementar o redimensionamento automático da altura com um QTextEdit, mas encontrei um problema estranho. Criei uma subclasse de QTextEdit e reimplementei sizeHint () assim:

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

this-> mounted_height é mantido atualizado por meio desse slot conectado ao sinal "contentsChanged ()" do 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();
}

A política de tamanho da subclasse QTextEdit é:

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

Eu segui essa abordagem depois de leresta postagem.

Aqui está o meu problema:

À medida que o QTextEdit é redimensionado gradualmente para preencher a janela, ele para de aumentar e começa a rolar dentro do QTextEdit, independentemente da altura retornada por sizeHint (). Se eu inicialmente tiver sizeHint () retornar algum número constante grande, o QTextEdit será muito grande e estará bem contido no QScrollArea externo, como seria de esperar. No entanto, se sizeHint ajusta gradualmente o tamanho do QTextEdit, em vez de apenas torná-lo realmente grande para iniciar, ele será concluído quando preencher a janela atual e começar a rolar em vez de aumentar.

Rastreei esse problema para que, independentemente do retorno do meu sizeHint (), ele nunca redimensione o QTextEdit maior que o valor retornado pelo maximumViewportSize (), herdado de QAbstractScrollArea. Observe que este não é o mesmo número que viewport () -> maximumSize (). Não consigo descobrir como definir esse valor.

Observando o código fonte do QT, maximumViewportSize () está retornando "o tamanho da viewport como se as barras de rolagem não tivessem um intervalo de rolagem válido". Esse valor é basicamente calculado como o tamanho atual do widget menos (2 * largura do quadro + margens) mais as larguras / alturas da barra de rolagem. Isso não faz muito sentido para mim e não está claro para mim por que esse número seria usado em qualquer lugar de uma maneira que substitua a implementação sizeHint () da subclasse. Além disso, parece estranho que o único número inteiro "frameWidth" seja usado no cálculo da largura e da altura.

Alguém por favor pode lançar alguma luz sobre isso? Suspeito que minha má compreensão do mecanismo de layout do QT seja responsável aqui.

Edit: depois de postar isso inicialmente, tive a ideia de reimplementar maximumViewportSize () para retornar a mesma coisa que sizeHint (). Infelizmente, isso não funcionou, pois ainda tenho o mesmo problema.

questionAnswers(2)

yourAnswerToTheQuestion