Qt布局管理按簡單分可分為絕對位置布局和布局管理器布局
一、絕對位置布局:
組件不放在布局管理器中,通過函數setGeometry(x,y,width,height)來設定組件相對其父窗口的位置。其中x,y是其左上角的坐標位置,width,height是組件的寬和高。
在絕對位置布局中,resize()可以調整組件尺寸,setGeometry()可以調整組件尺寸和位置,甚至重載sizeHint()函數也可以設定組件的尺寸。
存在的問題:絕對位置布局方式,組件的位置和尺寸固定,並不會隨着父窗口的尺寸的改變而發生改變。
二、布局器管理布局:
布局管理器類:QHBoxLayout,QVBoxLayout,QGridBoxLayout
布局器的優點是,組件的布局根據用戶設置和系統自行布局進行確定位置和尺寸,布局方式靈活,且組件的尺寸可以根據情況發生恰當的改變,布局美觀。
1)控件尺寸的設置:
注意:
1.默認情況下,使用布局器布局后,無論是resize()還是setGeometry()都會失去作用,因為布局管理器默認布局尺寸和位置是根據sizeHint()保存的數值進行布局的,這也是我們明明在程序中通過resize()、setGeometry()函數或者在qss樣式表中設置了組件的尺寸和位置,但組件的尺寸和位置並不會按照我們的設想布局的原因。
2.在布局管理器中,組件的長和寬默認會隨父窗口的調整而縮小或放大,以充分利用額外的空間,這就導致組件設定的尺寸並沒有很好的執行的原因。
幾點規律:
前提是在布局管理器中
1.組件的默認尺寸跟上述函數設置有關,但更主要根據sizeHint()的值來確定,所以別對上面的函數抱太大希望,也就是說上面的函數在布局器中會失效;
sizeHint()保存着系統推薦的最佳的尺寸,默認條件下,組件的尺寸總是根據這個保存值顯示。setSizePolicy可以改變顯示方式。
2.如果要固定組件的尺寸,調用setFixSize()。setMaximumSize()和setMinimumSize()分別確定組件的最大和最小尺寸。
3.通常使用setSizePolicy(QSizePolicy,QSizePolicy)用來設定組件縮放模式,參數模式為:
Constant | Value | Description |
---|---|---|
QSizePolicy.Fixed | 0 | 以 QWidget.sizeHint() 保存的值為定值,尺寸不再改變 |
QSizePolicy.Minimum | GrowFlag | sizeHint()值是最小值,尺寸可以變大,但不能比sizeHint()保存的值更小 |
QSizePolicy.Maximum | ShrinkFlag | sizeHint() 值為最大值,尺寸可以被擠壓到任意小,但不能比sizeHint()保存的值更大 |
QSizePolicy.Preferred | GrowFlag | ShrinkFlag | 以sizeHint()為最佳選擇,但是根據情況也可以變大縮小 |
QSizePolicy.Expanding | GrowFlag | ShrinkFlag | ExpandFlag | 以sizeHint()為合理的大小,但是會盡可能為組件提供更大的空間,即傾向於擴展 |
QSizePolicy.MinimumExpanding | GrowFlag | ExpandFlag | sizeHint()是最小尺寸但也足夠了,但是會盡可能獲得更大的空間 |
QSizePolicy.Ignored | ShrinkFlag | GrowFlag | IgnoreFlag | 忽略sizeHint()值,盡可能獲得更大的空間 |
2)布局管理器的設置:
布局管理器自帶的函數可以用於調整組件的位置,主要函數包括:
1.setContentsMargin(int left,int top,int right,int bottom) 設置布局器距離父窗體邊緣的距離;
2.setSpacing(int) 設置布局管理器內組件之間的距離,默認繼承自父管理器
3.addSpacing(int size) 在布局管理器的末尾添加一個大小不可拉伸的空間(一個QSpacerItem)。 QBoxLayout提供了默認的邊距和間距。 該功能增加了額外的空間。
4.addStretch(int factor) 在布局管理器末尾添加一個可拉伸空間(一個QSpacerItem)。空間最小可以為0,但由拉伸因子決定。
5.addSpacrItem(QSpacerItem(int w,int h,QSizePolicy,QSizePolicy)) 添加一個QSpacerItem至布局末尾,作用相當於addSpaceing。但由於QSpacerItem空白項可根據其參數設置的模式表現固定模式或者擴展模式等,因此該函數添加的空白塊是可以調節的。