您可以繼承QLayout來自訂版面配置管理員,您要有一個儲存QLayoutItem的容器,例如QList,每個QLayoutItem代表一個被加入版面配置的Widget元件。並且您要重新定義QLayout的幾個方法:
- addItem()
定義元件如何加入Layout之中,通常是定義元件如何加入容器(例如QList)。
- count()
加入Layout的元件個數。
- setGeometry()
定義元件實際的位置與大小配置方式。
- sizeHint()
設定Layout的偏好尺寸(preferred size)。
- itemAt()
定義如何根據索引取得QLayoutItem。
- takeAt()
定義如何根據索引取得並從容器中移除QLayoutItem。
除了以上幾個關於版面配置的方法必須實作之外,如果不想讓您的整個版面縮小至會覆蓋當中的元件的話,建議也實作minimumSize(),定義您的整個版面配置最小尺寸。
也可以看是否重新定義hasHeightForWidth(),傳回true或false,表示是否根據元件的寬度來設定版面配置的高度,如果hasHeightForWidth()傳回true就會呼叫heightForWidth(),您可以重新定義它,這讓整個版面有足夠的高度來顯示所有的元件。
另外,重新定義expandingDirections(),如果必要的話,決定是否可使用比sizeHint()更大的額外空間,預設是Qt:: Vertical | Qt::Horizontal,表示必要的話,可以往水平或垂直方向自動擴展Layout空間,或傳回0表示不擴展。
關於自訂Layout的程式碼示範,可以參考Qt線上文件的範例 Flow Layout 或 Border Layout,當中有完整的程式碼示範。
當您自訂Widget時,如果使用版面管理員來配置child元件,則版面管理員會自動幫您配置Widget相關的版面屬性,如果您沒有使用版面管理員, 而是自訂child元件的版面配置,則最好重新定義QWidget的相關方法以定義其在parent元件中的版面配置,像是sizeHint()以設定自 訂Widgt的偏好尺寸,重新定義QWidget的minimunSize()以設定Widget的最小尺寸等。
定義版面配置,基本上不是件易事,可以的話,儘量使用Qt現有的版面配置管理,如果有需要自訂版面配置,建議參考一下Qt線上文件的 Layout Management。