14

複数の 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() と同じものを返すという考えがありました。残念ながら、私はまだ同じ問題を抱えているため、これは機能しませんでした。

4

2 に答える 2

11

私はこの問題を解決しました。それを機能させるために私がしなければならなかった2つのことがありました:

  1. ウィジェット階層を上っていき、すべてのサイズ ポリシーが理にかなっていることを確認して、子ウィジェットが大きく/小さくなりたい場合、親ウィジェットも同じものになりたいと思うようにします。

  2. これが修正の主なソースです。QTextEdit は QScrollArea のメイン ウィジェットである QFrame 内にあるため、QScrollArea には、「widgetResizable」プロパティが true でない限り、内部ウィジェットのサイズを変更しないという制約があります。そのためのドキュメントはここにあります: http://doc.qt.io/qt-4.8/qscrollarea.html#widgetResizable-prop。この設定をいじって動作させるまで、ドキュメントは明確ではありませんでした。ドキュメントから、このプロパティは、メインのスクロール領域がウィジェットのサイズを変更したい場合 (つまり、親から子へ) のみを処理するようです。実際には、スクロール領域のメイン ウィジェットのサイズを変更したい場合 (子から親へ)、この設定を true に設定する必要があることを意味します。

つまり、この話の教訓は、sizeHint をオーバーライドする QTextEdit コードは正しかったが、QScrollArea はメイン フレームの sizeHint から返された値を無視していたということです。

わーい!できます!

于 2010-06-19T19:13:57.783 に答える
0

minimumSizeのプロパティを設定QTextEditして、レイアウトが拡大するかどうかを確認してみてください。

Qtのレイアウトスキームのほとんどを理解していませんが、最小サイズと最大サイズを設定することで、私がやりたいことをほぼ実行できます。とにかく、ほとんどの場合。

于 2010-06-16T17:05:44.483 に答える