void QAbstractScrollArea::setViewportMargins(int left, int top, int right, int bottom) のドキュメントには次のように書かれています:
スクロール領域の周囲のマージンを左、上、右、および下に設定します。これは、「ロックされた」行と列を持つスプレッドシートなどのアプリケーションに役立ちます。余白は空白のままです。未使用領域にウィジェットを配置します。この関数は QTreeView と QTableView によって頻繁に呼び出されるため、QAbstractScrollArea サブクラスによってマージンを実装する必要があることに注意してください。また、アイテム ビューでサブクラスを使用する場合は、この関数を呼び出さないでください。
まず、説明自体に戸惑いました。関数は仮想ではないため、マージンを提供するために再実装する必要はありません。いつ、どの時点でそれを呼び出す必要がありますか? また、QTreeView が独自の値で内部的に呼び出している場合、呼び出しがどのように連携するか? Qt のソースを見ると、QTreeView::updateGeometries() がパラメーター (本質的に) 0、headerHeight、0、0 でそれを呼び出すことがわかりました。
さらにグーグルで調べてみると、他の人がオーバーライドされた resizeEvent() から setViewportMargins() を呼び出していることがわかりました。だから私もそうしましたが、これはうまくいきますが:
- この手法が、本質的にハードコーディングされたパラメーターで setViewportMargins() を呼び出す内部 QTreeView::updateGeometries() とどのように共存するのか疑問に思っています (ヘッダーが非表示の場合、headerHeight のみが 0 に変更されます)。
- 機能しますが、ヘッダーの上に「未使用領域」が表示されます。ただし、ドキュメントで言及されている「ロックされた」行を実装するには、この領域をヘッダーの下に配置する必要があります
updateGeometries() をオーバーライドし、(QTreeView::updateGeometries(); を呼び出した後) header() を一番上に移動することで、ヘッダーの下に未使用の領域を確保しました。しかし、これが正しいことかどうかはわかりません。
私の質問は次のとおりです。 「ロックされた」行を実装する方法は、 setViewportMargins() ドキュメントによって意味され、実際にどのように実装する必要がありますか?
固定された行 (または列) を実装する別の方法について認識していることに注意してください - Frozen Column Example。しかし、この手法はメイン テーブル (ツリー) ウィジェットの最初の行 (列) を非表示にし、オーバーレイ (静的) ウィジェットに表示するため、これはまさに私が必要とするものではありません。私の場合、ヘッダーの下の領域に別の情報が必要であり、メインウィジェットを実際に下に移動してすべての行を表示する必要があります