在迄今爲止講到每個例子中,咱們只是簡單的把窗口部件放置到某個肯定的佈局中。但在某些狀況下,由此造成的佈局看起來可能還不是咱們最想要的形式。在這些情形中,能夠經過改變要擺放的窗口部件的大小策略和大小提示來調整佈局。html
1.大小提示(size hint)和最小大小提示(minimum size hint)函數
在介紹Qt窗口部件的大小策略以前,首先介紹大小提示(size hint)和最小大小提示(minimum size hint)。佈局
⑴ 大小提示spa
大小提示是Qt爲一個窗口部件推薦的尺寸。當Qt GUI窗口部件進行初始化時,將經過QWidget::sizeHint()來得到窗口部件的大小提示,這是一個虛函數,它的原型爲:.net
virtual QSize sizeHint () const
在未被重載的狀況下,它的返回值是這樣的:orm
◆ 若是該窗口部件不屬於任何佈局管理器,那麼該函數將返回一個無效的值;htm
◆ 若是該窗口部件屬於某個佈局管理器,那麼該函數將返回一個該佈局管理器認爲比較合適的尺寸。blog
⑵ 最小大小提示ci
最小大小提示(minimum size hint)是Qt爲窗口部件推薦的最小尺寸,它的使用規則是:開發
若是須要繪製的窗口部件的尺寸(包括長和高兩個方面)小於其最小提示(這在Qt Designer中每每表現爲有些被壓縮的看不到它的內容),而且該窗口部件的最小提示在最大尺寸和最小尺寸容許的範圍內,那麼該窗口部件顯示的尺寸將是其最小提示的值。
設置窗口部件的最小大小提示是經過QWidget::minimumSizeHint()完成的。它的返回值有以下情景:
◆ 若是該窗口部件沒有佈局管理器,該函數返回一個無效的值;
◆ 若是該窗口部件屬於某個佈局管理器,該函數返回佈局管理器認爲合適的一個尺寸。
2.大小策略(size policy)
一個窗口部件的大小策略會告訴佈局系統應該如何對它進行拉伸或收縮。Qt爲它全部的內置窗口部件都提供了合理的默認大小策略值,可是因爲不可能爲每一種可能產生的佈局都提供惟一的默認值,因此在一個窗體中,開發人員改變它上面的一個或兩個窗口部件的大小策略是很是廣泛的現象。一個QSizePolicy既包含一個水平份量也包含一個垂直份量。如下是一些經常使用的取值:
表11-1 枚舉值QSizePolicy::Policy的內容
枚舉常量 |
值 |
說明 |
QSizePolicy::Fixed |
0 |
大小提示是該窗口部件的惟一尺寸選擇,因此它不會發生任何的伸縮。 |
QSizePolicy::Minimum |
GrowFlag |
大小提示是該窗口部件的最小尺寸,它不會變得更小,但它能夠變得更大,不過採用該策略的窗口部件在「爭奪」空間上不佔優點。 |
QSizePolicy::Maximum |
ShrinkFlag |
大小提示是該窗口部件的最大尺寸,也就是該窗口部件不會比大小提示的尺寸更大。該窗口部件能夠在沒有受到其它窗口部件「要求」的狀況下,自由的縮小尺寸。 |
QSizePolicy::Preferred |
GrowFlag | ShrinkFlag |
通常狀況下,該窗口部件會將大小提示做爲它的優先和最佳選擇,但它也能夠變得足夠的小,也能夠變大,但不佔優點。該策略是QWidget窗口部件默認的策略。 |
QSizePolicy::Expanding |
GrowFlag | ShrinkFlag | ExpandFlag |
採用該策略的窗口部件也可以感受到尺寸提示,可是它傾向於儘量的佔用更大的空間,該窗口部件也能夠變得足夠小。 |
QSizePolicy::MinimumExpanding |
GrowFlag | ExpandFlag |
大小提示將是該窗口部件的最小尺寸,該窗口部件將盡量的佔用更多的空間。該策略已經再也不被推薦使用,建議用Expanding替代它,而且重載minimumSizeHint()。 |
QSizePolicy::Ignored |
ShrinkFlag | GrowFlag | IgnoreFlag |
與Expanding有些類似,只是全部的大小提示都被忽略,該窗口部件將會盡量的佔用空間。 |
表11-1中的「值」這一列實際上告訴了咱們每一種策略通常是具備「傾向性」的,好比QSizePolicy::Fixed的值爲0,則它「傾向於」保持本身的大小不變,即保持大小提示的尺寸。而QSizePolicy::Expanding的值是3個值的疊加,總的「傾向性」是趨於佔用更多空間的,等等。這就爲當多個具備不一樣大小策略的窗口部件放置在一塊兒時,如何判斷它們佔用空間的模式提供了基本的判斷依據,如下是幾種常見的組合。
◆ 相同大小策略的窗口部件被佈局管理器組合在一塊兒。在這種狀況下,除了窗口部件不能超出它的大小範圍外,不一樣的窗口部件能夠按本身的伸縮因子在其容許的範圍內自由的伸縮。
◆ QSizePolicy::Fixed和任何其餘的大小策略組合在一塊兒。
具備QSizePolicy::Fixed大小策略的窗口部件其大小是不變的,即保持在sizeHint()大小,而其餘的窗口部件能夠在容許的範圍內自由伸縮。
◆ QSizePolicy::Preferred和QSizePolicy::Expanding組合在一塊兒。
具備QSizePolicy::Preferred尺寸策略的窗口部件其大小是不變的,即它認爲大小提示是最適合它的,而其餘的窗口部件大小能夠在其容許的範圍內自由伸縮。
◆ QSizePolicy::Ignored和其餘尺寸策略(QSizePolicy::Fixed策略除外)組合在一塊兒的時候,不一樣的窗口部件在各自容許的範圍內自由伸縮。
◆ QSizePolicy::Preferred,QSizePolicy::Minimum和QSizePolicy::Maximum組合在一塊兒的時候,各窗口部件在各自容許的範圍內能夠自由伸縮。
3.伸縮因子(stretch factor)
除了大小策略中包含的水平方向和垂直方向兩個份量以外,QSizePolicy類還保存了水平方向和垂直方向的一個伸縮因子。這些伸縮因子能夠用來講明在增大窗體時,對不一樣的子窗口部件應使用的不一樣放大比例。即須要設置QSizePolicy::horizontalStretch和QSizePolicy::verticalStretch的值來實現。默認狀況下,被佈局管理器組合在一塊兒的窗口部件的伸縮因子是相等的,都爲0。此時,在全部的窗口部件都沒有超出各自的大小範圍容許的狀況下,窗口部件的大小始終相等。
例如,假定在一個QListWidget的右面還有一個QTextEdit,而且但願這個QTextEdit的長度可以是QListWidget長度的兩倍,那麼就能夠把這個QTextEdit在水平方向上的拉伸因子(QSizePolicy::horizontalStretch)設置爲2,而把QListWidget在水平方向上的拉伸因子(QSizePolicy::horizontalStretch)設置爲1;垂直方向上保持默認爲0,即二者同樣的高。這樣設置的效果如圖11-10所示。
4.大小約束(size constraint)
影響佈局方式的另外一種方法是設置它的子窗口部件的最大大小、最小大小或固定大小。這些是經過設置sizeConstraint屬性來完成的。該屬性值是一個枚舉常量,定義了佈局的大小約束的模式。表列出了它全部可能的取值,它的默認值是QLayout::SetDefaultConstraint。獲取和設置該屬性值能夠經過QWidget::layout()來獲取主窗口部件的佈局管理器,而後能夠調用QLayout::sizeConstraint()函數來查看當前的設置狀況,而後再經過QLayout::setSizeConstraint()函數來設置該佈局管理器的sizeConstraint屬性。這兩種函數的原型以下:
SizeConstraint sizeConstraint () const
void setSizeConstraint ( SizeConstraint )
其中,SizeConstraint的取值便是在表11-2中的枚舉值的範圍內。
表11-2 佈局管理器的大小約束屬性(QLayout::SizeConstraint)可能的取值
常量 |
值 |
說明 |
QLayout::SetDefaultConstraint |
0 |
主窗口部件的最小尺寸設置爲minimumSize(),除非該窗口部件已經有一個最小尺寸 |
QLayout::SetFixedSize |
3 |
主窗口部件的尺寸設置爲sizeHint(),而且不容許改變該窗口部件的尺寸 |
QLayout::SetMinimumSize |
2 |
主窗口部件的最小尺寸設置爲minimumSize(),而且該窗口部件不可以變得更小 |
QLayout::SetMaximumSize |
4 |
主窗口部件的最大尺寸設置爲maximumSize(),而且該窗口部件不可以變得更大 |
QLayout::SetMinAndMaxSize |
5 |
主窗口部件的最小尺寸設置爲minimumSize(),最大尺寸設置爲maximumSize() |
QLayout::SetNoConstraint |
1 |
主窗口部件的大小不會受到約束 |
5.空白(margin)和間距(spacing)
每種佈局都有兩個重要的屬性,空白和間距。空白指的是整個佈局四周距離窗體邊緣的距離;間距指的是佈局管理器內部各個窗口部件之間的距離。
空白屬性即margin(),間距屬性即spacing(),它們的默認值是有窗體的風格決定的。Qt的默認風格下,子窗體部件的margin()的值是9英寸,窗體的margin()值是11英寸。spacing()的值與margin()相同。
若是要設置這兩個值能夠經過setMargin()和setSpacing()。
注意,從Qt4.3開始,margin()屬性已經逐漸再也不被Qt4所推薦,更好的設置空白的方法是使用setContentsMargins()方法,它的原型以下:
void QLayout::setContentsMargins ( int left, int top, int right, int bottom )
其中,left, top, right, 和 bottom表示環繞在佈局周圍的空白。
對於QGridLayout 和QFormLayout,不要使用setSpacing()方法,而是要分別使用setHorizontalSpacing()和setVerticalSpacing()方法來設置水平和垂直方向的間距。若是你使用了setSpacing()方法,獲取spacing()時,它的返回值將爲-1。
轉自:http://blog.csdn.net/qter_wd007/article/details/5377882