複数の QT ウィジェットを含むフォーム内で QTextEdit ウィジェットを使用しようとしています。フォーム自体は、ウィンドウの中央ウィジェットである QScrollArea 内にあります。私の意図は、必要なスクロールがメインの QScrollArea (ウィジェット内ではなく) で行われ、内部のウィジェットはコンテンツを保持するために高さを自動的に変更することです。
QTextEdit を使用して高さの自動サイズ変更を実装しようとしましたが、奇妙な問題が発生しました。QTextEdit のサブクラスを作成し、次のように sizeHint() を再実装しました。
QSize OperationEditor::sizeHint() const {
QSize sizehint = QTextBrowser::sizeHint();
sizehint.setHeight(this->fitted_height);
return sizehint;
}
this->fitted_height は、QTextEdit の「contentsChanged()」シグナルに接続されているこのスロットを介して最新の状態に保たれます。
void OperationEditor::fitHeightToDocument() {
this->document()->setTextWidth(this->viewport()->width());
QSize document_size(this->document()->size().toSize());
this->fitted_height = document_size.height();
this->updateGeometry();
}
QTextEdit サブクラスのサイズ ポリシーは次のとおりです。
this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
この投稿を読んだ後、私はこのアプローチをとりました。
これが私の問題です:
QTextEdit がウィンドウを埋めるために徐々にサイズ変更されると、sizeHint() から返された高さに関係なく、大きくなるのを止めて QTextEdit 内でスクロールを開始します。最初に sizeHint() が大きな定数を返すようにすると、QTextEdit は非常に大きくなり、予想どおり、外側の QScrollArea 内にうまく収まります。ただし、 sizeHint が QTextEdit のサイズを単に大きくするのではなく徐々に調整すると、現在のウィンドウがいっぱいになった時点で上限に達し、拡大する代わりにスクロールを開始します。
この問題は、sizeHint() が何を返しても、QTextEdit のサイズが QAbstractScrollArea から継承された maximumViewportSize() から返される値よりも大きくなることは決してないということがわかりました。これは、viewport()->maximumSize() と同じ数ではないことに注意してください。その値を設定する方法がわかりません。
QT のソース コードを見ると、 maximumViewportSize() は「スクロール バーに有効なスクロール範囲がないかのようにビューポートのサイズ」を返しています。この値は基本的に、ウィジェットの現在のサイズから (2 * frameWidth + マージン) とスクロールバーの幅/高さを足して計算されます。これは私にはあまり意味がありません。また、サブクラスの sizeHint() 実装に取って代わる方法でその番号がどこでも使用される理由が明確ではありません。また、単一の「frameWidth」整数が幅と高さの両方の計算に使用されるのは奇妙に思えます。
誰でもこれに光を当てることができますか?QT のレイアウト エンジンに対する私の理解不足が原因ではないかと思います。
編集:これを最初に投稿した後、maximumViewportSize() を再実装して sizeHint() と同じものを返すという考えがありました。残念ながら、私はまだ同じ問題を抱えているため、これは機能しませんでした。