Resizing QTs QTextEdit, um der Texthöhe zu entsprechen: maximumViewportSize ()

Ich versuche, ein QTextEdit-Widget in einem Formular zu verwenden, das mehrere QT-Widgets enthält. Das Formular selbst befindet sich in einer QScrollArea, dem zentralen Widget für ein Fenster. Mein Ziel ist es, dass alle erforderlichen Bildläufe in der Haupt-QScrollArea stattfinden (und nicht in Widgets). Alle Widgets in der QScrollArea ändern automatisch ihre Höhe, um ihren Inhalt zu speichern.

Ich habe versucht, die automatische Größenänderung der Höhe mit einem QTextEdit zu implementieren, bin aber auf ein merkwürdiges Problem gestoßen. Ich habe eine Unterklasse von QTextEdit erstellt und sizeHint () wie folgt neu implementiert:

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

this-> fits_height wird über diesen Steckplatz, der mit dem QTextEdit-Signal "contentsChanged ()" verbunden ist, auf dem neuesten Stand gehalten:

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

Die Größenrichtlinie der QTextEdit-Unterklasse lautet:

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

Ich habe diesen Ansatz nach dem Lesen vondieser Beitrag

Hier ist mein Problem:

Als QTextEdit die Größe des Fensters allmählich ändert, wird es nicht mehr größer und scrollt innerhalb von QTextEdit, unabhängig davon, welche Höhe von sizeHint () zurückgegeben wird. Wenn sizeHint () anfangs eine große konstante Zahl zurückgibt, ist QTextEdit sehr groß und befindet sich erwartungsgemäß in der äußeren QScrollArea. Wenn jedoch sizeHint die Größe von QTextEdit allmählich anpasst, anstatt es nur wirklich groß zu machen, um zu beginnen, wird es oben angeführt, wenn es das aktuelle Fenster ausfüllt und mit dem Scrollen beginnt, anstatt zu wachsen.

Ich habe festgestellt, dass das QTextEdit-Objekt unabhängig von der Größe, die ich mit sizeHint () zurückgebe, niemals die Größe des von maximumViewportSize () zurückgegebenen Werts überschreitet, der von QAbstractScrollArea geerbt wird. Beachten Sie, dass dies nicht dieselbe Nummer ist wie viewport () -> maximumSize (). Ich kann nicht herausfinden, wie ich diesen Wert festlegen soll.

Beim Betrachten des QT-Quellcodes gibt maximumViewportSize () "die Größe des Ansichtsfensters zurück, als ob die Bildlaufleisten keinen gültigen Bildlaufbereich hätten". Dieser Wert wird im Grunde genommen als die aktuelle Größe des Widgets minus (2 * FrameWidth + Ränder) plus alle Bildlaufleistenbreiten / -höhen berechnet. Das macht für mich wenig Sinn und es ist für mich nicht klar, warum diese Zahl irgendwo so verwendet wird, dass sie die sizeHint () -Implementierung der Unterklasse übersteigt. Es scheint auch seltsam, dass die einzelne Ganzzahl "frameWidth" sowohl für die Berechnung der Breite als auch der Höhe verwendet wird.

Kann jemand bitte Licht ins Dunkel bringen? Ich vermute, dass mein schlechtes Verständnis der Layout-Engine von QT hier die Schuld trägt.

Edit: Nach dem ersten Posten hatte ich die Idee, maximumViewportSize () erneut zu implementieren, um das Gleiche wie sizeHint () zurückzugeben. Das hat leider nicht geklappt, da ich immer noch das gleiche Problem habe.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage