一、 引言
在Designer的部件欄中,有兩種類型的Spacers部件,下圖中上面布局中為一個水平間隔部件(按鈕1和按鈕2之間的部件),下面布局中為一個垂直間隔部件(按鈕3和4之間),如圖:
這兩種部件用於在布局中不同部件間增加間隔,以輔助解決一些布局無法完美解決的部件布局排列美觀問題。
二、 Spacers部件的相關屬性
2.1、概述
Spacers部件非常簡單,除了名字之外只有三個屬性,分別是orientation、sizeType和sizeHint。Spacers部件對應的類實際上是QSpacerItem類,但從QSpacerItem類來看,除了sizeHint屬性能與Designer中的部件屬性相同之外,並沒有orientation、sizeType這兩個屬性。這是由於Spacers部件本身的特殊性導致的。
2.2、orientation和sizeType屬性
從引言中的圖可以看出,兩種Spacers部件在Designer中的部件圖形表現為兩種線型,水平間隔部件(Horizontal Spacer)體現為一根比較粗的橫線,垂直間隔部件(Vertical Spacer)體現為一根比較粗的豎線。
對這兩種部件來說,橫線對應部件在拉伸時的高度大小策略沒有意義,豎線對應部件在拉伸時的寬度大小策略沒有意義,因此Spacer部件的sizeType實際上就是sizePolicy,對應取值及含義也與sizePolicy一樣:
只是sizePolicy一般是兩維的(橫向和縱向),而這里只有一維,具體是哪一維需要根據是橫線部件還是豎線部件來確認,而方向是來確認使用哪一維:如果是水平橫向,則sizeType表示寬度的拉伸策略,如果是垂直縱向,則sizeType表示高度的拉伸策略,另一維的拉伸策略都固定為QSizePolicy.Minimum。因此方向是僅用於確認sizeType的值是對應寬度還是高度的大小策略,本身並沒有對應的單獨類屬性。
2.3、sizeHint屬性
sizeHint為Qt建議部件的大小,也稱為首選大小。在《PyQt(Python+Qt)學習隨筆:Qt Designer中部件的三個屬性sizeHint缺省尺寸、minimumSizeHint建議最小尺寸和minimumSize最小尺寸》中我們說sizeHint為布局管理器中部件的缺省大小,該值是Qt中對每個部件大小的建議值,也是缺省值,不能修改,但在Spacer部件中是可以修改的,這是因為Spacer部件不是從QWidget類派生的部件,這里的sizeHint也並不簡單是缺省大小。
Spacer部件的實際大小受部件的大小策略、sizeHint以及布局中其他部件的影響,具體參考上表sizePolicy的說明。
三、 Spacers部件的類型和方向的關系
上面已經介紹了Spacer部件的方向確認的是部件拉伸擴展策略作用的對象是垂直高度還是水平方向。而Spacers部件的兩種類型其實就是缺省確認了兩個不同的方向,水平間隔部件(Horizontal Spacer)的方向缺省就是水平方向,垂直間隔部件(Vertical Spacer)部件的方向缺省就是垂直方向。
可以通過屬性編輯界面的orientation來改變缺省方向,即將水平間隔部件方向改為垂直方向,垂直間隔部件部件的方向改為水平方向。方向改變后的水平間隔部件實際上就變成了垂直間隔部件,反之亦然,因此這兩個部件本質上就是一種。
我們通過生成的代碼來對照看一下。
引言中的截圖使用的間隔部件上面布局的是水平間隔部件,sizeHint被設置為(40,20),方向為水平方向,下面布局的是垂直間隔部件,sizeHint被設置為(20,40),方向為垂直方向,二者的sizeType被設置為Expanding。生成的創建Spacer部件的對應代碼分別如下:
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
當兩個間隔部件的方向改變之后,窗口布局變成如下:
生成的代碼如下:
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
對比看一下代碼,方向改變之后,就是部件創建時候的代碼發生了兩處變化:
1、 sizeHint的值的寬度和高度交換了一下值;
2、 sizePolicy的取值也發生了交換。
變換后, sizeHint的寬度變高度、高度變寬度,按默認值應該是方向指定維度變大、非指定維度變小,方向所指定的維度(即高度或寬度)的sizePolicy變更為sizeType指定值,另一個維度固定為Minimum策略。
四、 Spacers部件的使用
Spacers部件是在布局中的子部件周邊或部件間增加間隔的空間,使得界面布局更合理。
1、 水平方向間隔部件一般是當布局內某個可以水平拉伸的部件希望不被拉伸時使用。
兩個按鈕在水平布局內水平排列,如圖:
如果不設置間隔部件拉伸該窗口:
這個效果比較難看。如果在兩個按鈕前后都放置一個水平間隔部件,則拉伸后的效果如圖:
此時再縮小如圖:
可以明顯看到加了間隔部件的效果要好看多了。
2、 垂直方向間隔部件一般是當布局內某個可以垂直拉伸的部件希望不被拉伸時使用。
兩個按鈕垂直布局內排列如圖:
拉伸后效果如圖:
在垂直方向加2個垂直間隔部件后拉伸效果如圖:
如果在窗體布局(水平布局)上再增加水平間隔部件可以得到如下效果:
如果再調整右下角的垂直間隔部件的sizeType為Maximum,則可以得到如下效果:
五、 代碼實現Spacers部件的增加
如果要在一個布局內增加間隔部件,只要在生成部件的代碼中適當位置增加部件生成的代碼就可以,有2種方法實現。
5.1、使用spacerItem方法
spaceItem = QtWidgets.QSpacerItem(int sizeHint.width, int sizeHint.height,
QSizePolicy.Policy widthPolicy, QSizePolicy.Policy heightPolicy)
布局.addItem(spaceItem)
5.2、使用addStretch方法
QBoxLayout.addStretch(int stretch = 0)
直接在要插入間隔部件的代碼位置使用缺省值調用該方法就可以。
本節詳細介紹了Qt Designer的間隔部件的屬性和使用方法,並將可視部件與類QSpacerItem的對應關系進行了分析,最后給出了通過代碼實現的兩種方案,並給出了使用的案例。從給出的案例可以看出,間隔部件可以很好地提升布局的美觀。