Qt系列-5、控件的大小策略


1 合適的大小

sizeHint : const QSize

This property holds the recommended size for the widget.

If the value of this property is an invalid size, no size is recommended.

The default implementation of sizeHint() returns an invalid size if there is no layout for this widget, and returns the layout's preferred size otherwise.

Access functions:

virtual QSize sizeHint () const


翻譯:

這個屬性爲部件提供了大小,如果這個屬性的值是無效的,那麼沒有大小可被提供,如果這個部件沒有layout佈局那麼默認的sizeHint()的實現將返回無效的值,相反sizeHint()則返回一個layout理想的大小。

這就說明,我們使用sizeHint()時要使用在layout佈局中,如果沒有佈局則會失效。

◆  如果該窗口部件不屬於任何佈局管理器,那麼該函數將返回一個無效的值;

 

2 最小合適大小

minimumSizeHint : const QSize

This property holds the recommended minimum size for the widget.

If the value of this property is an invalid size, no minimum size is recommended.

The default implementation of minimumSizeHint() returns an invalid size if there is no layout for this widget, and returns the layout's minimum size otherwise. Most built-in widgets reimplement minimumSizeHint().

QLayout will never resize a widget to a size smaller than the minimum size hint unless minimumSize() is set or the size policy is set to QSizePolicy::Ignore. If minimumSize() is set, the minimum size hint will be ignored.

Access functions:

virtual QSize minimumSizeHint () const

翻譯: 這個屬性爲部件提供了最小大小。如果這個屬性是一個無效的值,那麼沒有最小大小可提供,如果這個部件沒有佈局那麼默認minimumSizeHint()將返回一個無效的值,相反將返回一個佈局的最小合適的大小值。

最小大小提示(minimum size hint)是Qt爲窗口部件推薦的最小尺寸,它的使用規則是:

如果需要繪製的窗口部件的尺寸(包括長和高兩個方面)小於其最小提示(這在Qt Designer中往往表現爲有些被壓縮的看不到它的內容),並且該窗口部件的最小提示在最大尺寸和最小尺寸允許的範圍內,那麼該窗口部件顯示的尺寸將是其最小提示的值。

設置窗口部件的最小大小提示是通過QWidget::minimumSizeHint()完成的。它的返回值有如下情景:

◆  如果該窗口部件沒有佈局管理器,該函數返回一個無效的值;

◆  如果該窗口部件屬於某個佈局管理器,該函數返回佈局管理器認爲合適的一個尺寸。

 

3.大小策略(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組合在一起的時候,各窗口部件在各自允許的範圍內可以自由伸縮。

4.伸縮因子(stretch factor)

    除了大小策略中包含的水平方向和垂直方向兩個分量之外,QSizePolicy類還保存了水平方向和垂直方向的一個伸縮因子。這些伸縮因子可以用來說明在增大窗體時,對不同的子窗口部件應使用的不同放大比例。即需要設置QSizePolicy::horizontalStretch和QSizePolicy::verticalStretch的值來實現。默認情況下,被佈局管理器組合在一起的窗口部件的伸縮因子是相等的,都爲0。此時,在所有的窗口部件都沒有超出各自的大小範圍允許的情況下,窗口部件的大小始終相等。

例如,假定在一個QListWidget的右面還有一個QTextEdit,並且希望這個QTextEdit的長度能夠是QListWidget長度的兩倍,那麼就可以把這個QTextEdit在水平方向上的拉伸因子(QSizePolicy::horizontalStretch)設置爲2,而把QListWidget在水平方向上的拉伸因子(QSizePolicy::horizontalStretch)設置爲1;垂直方向上保持默認爲0,即兩者一樣的高。 

5.大小約束(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

主窗口部件的大小不會受到約束

6.空白(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 )

其中,lefttopright, 和 bottom表示環繞在佈局周圍的空白。

對於QGridLayout 和QFormLayout,不要使用setSpacing()方法,而是要分別使用setHorizontalSpacing()setVerticalSpacing()方法來設置水平和垂直方向的間距。如果你使用了setSpacing()方法,獲取spacing()時,它的返回值將爲-1。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章