? ? ? Qt6.8的布局管理系統,用于自動排列部件:水平布局QHBoxLayout、垂直布局QVBoxLayout、網格布局QGridLayout、表單布局QFormLayout
? ? ? 布局(layout)是一種優雅而靈活的方式,可以在其容器內自動排列子部件(child widgets)。每個部件通過sizeHint和sizePolicy屬性向布局報告其尺寸要求,布局會相應地分配可用空間。
? ? ? Qt布局系統(layout system)提供了一種簡單而強大的方法,可以自動排列部件中的子部件,以確保它們充分利用可用空間。
? ? ? Qt包含一組布局管理類,用于描述部件在應用程序用戶界面中的布局方式。當部件的可用空間發生變化時,這些布局會自動定位和調整部件的大小,以確保部件的排列一致,并確保整個用戶界面保持可用。
? ? ? 所有QWidget子類都可以使用布局來管理其子項。QWidget::setLayout()函數將布局應用于部件。當以這種方式在部件上設置布局時,它將負責以下任務:
? ? ? (1).子部件的定位
? ? ? (2).合理的窗口默認大小
? ? ? (3).合理的窗口最小大小
? ? ? (4).調整大小處理
? ? ? (5).內容更改時的自動更新:子部件的字體大小、文本或其它內容;隱藏或顯示子部件;移除子部件
? ? ? Qt的布局類專為手寫C++代碼而設計,允許以像素為單位指定測量值,從而簡化了代碼的理解和使用。使用Qt Widgets Designer創建的表單(form)生成的代碼也使用了布局類。Qt Widgets Designer在嘗試表單設計時非常有用,因為它避免了用戶界面開發中通常涉及的編譯、鏈接和運行周期。
? ? ? 為Widget提供良好布局的最簡單方法是使用內置布局管理器:QHBoxLayout、QVBoxLayout、QGridLayout和QFormLayout。這些類繼承自QLayout,而QLayout又派生自QObject(而非QWidget)。它們負責一組Widget的幾何管理(geometry management)。要創建更復雜的布局,你可以將布局管理器嵌套使用。
? ? ? (1).QHBoxLayout:將部件布置在水平行中,從左到右(對于從右到左的語言,則從右到左)。
? ? ? (2).QVBoxLayout:將部件從上到下排列在垂直列中。
? ? ? (3).QGridLayout:在二維網格中布局部件。部件可以占據多個單元格。
? ? ? (4).QFormLayout:以2列描述性標簽字段樣式布置部件。
? ? ? 使用布局的技巧:
? ? ? (1).使用布局時,構造子部件時無需傳遞父級。布局會自動重新設置部件的父級(使用QWidget::setParent()),使它們成為安裝該布局的部件的子級。注意:布局中的部件是安裝該布局的部件的子級,而不是布局本身的子級。部件只能以其他部件為父級,而不能以布局為父級。
? ? ? (2).你可以使用addLayout()在布局上嵌套布局;內部布局將成為其所插入布局的子級。
? ? ? 將部件添加到布局時,布局過程如下:
? ? ? (1).所有部件最初都會根據其QWidget::sizePolicy()和QWidget::sizeHint()分配一定大小的空間。
? ? ? (2).如果任何部件設置的拉伸因子(stretch factor)大于零,則它們會根據拉伸因子的比例分配空間。
? ? ? (3).如果任何部件設置的拉伸因子為零,則只有在沒有其他部件需要空間的情況下,它們才會獲得更多空間。其中,首先會將空間分配給采用擴展大小策略(Expanding size policy)的部件。
? ? ? (4).任何分配空間小于其最小尺寸(如果未指定最小尺寸,則為最小尺寸提示(hint))的部件都會分配其所需的最小尺寸。(部件無需設置最小尺寸或最小尺寸提示,在這種情況下拉伸因子是其決定因素。)
? ? ? (5).任何分配空間大于其最大尺寸的部件都會分配其所需的最大尺寸。(部件無需設置最大尺寸,在這種情況下拉伸因子是其決定因素。)
? ? ? 拉伸因子:Widget通常在創建時不設置任何拉伸因子。當它們在布局中布局時,會根據其QWidget::sizePolicy()或最小尺寸提示,以較大者為準分配相應的空間。拉伸因子用于更改Widget所占空間的比例。
? ? ? 布局中自定義Widget:
? ? ? (1).創建自己的Widget類時,還應該傳遞其布局屬性。如果Widget使用了Qt布局中的一個,則布局屬性已處理完畢。如果Widget沒有任何子Widget,或者使用手動布局,則可以使用以下任何或所有機制更改Widget的行為:
? ? ? 重新實現QWidget::sizeHint()以返回Widget的首選大小。
? ? ? 重新實現QWidget::minimumSizeHint()以返回Widget可以擁有的最小大小。
? ? ? 調用QWidget::setSizePolicy()以指定Widget的空間需求。
? ? ? (2).每當尺寸提示、最小尺寸提示或尺寸策略發生變化時,都應調用QWidget::updateGeometry()。這將導致重新計算布局。多次連續調用 QWidget::updateGeometry()只會導致一次布局重新計算。
? ? ? 在Qt Creator中使用布局,如下圖所示:
? ? ? 注:以上整理的內容主要來自于Qt官方文檔
? ? ? GitHub:https://github.com/fengbingchun/Qt_Test