Qt-優化布局結構


在迄今為止講到每一個例子中,我們只是簡單的把窗口部件放置到某個確定的布局中。但在某些情況下,由此形成的布局看起來可能還不是我們最想要的形式。在這些情形中,可以通過改變要擺放的窗口部件的大小策略和大小提示來調整布局。

1.大小提示(size hint)和最小大小提示(minimum size hint)

在介紹Qt窗口部件的大小策略之前,首先介紹大小提示(size hint)和最小大小提示(minimum size hint)。

⑴ 大小提示

大小提示是Qt為一個窗口部件推薦的尺寸。當Qt GUI窗口部件進行初始化時,將通過QWidget::sizeHint()來獲得窗口部件的大小提示,這是一個虛函數,它的原型為:

     virtual QSize sizeHint () const

 

在未被重載的情況下,它的返回值是這樣的:

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

◆  如果該窗口部件屬於某個布局管理器,那么該函數將返回一個該布局管理器認為比較合適的尺寸。

⑵ 最小大小提示

最小大小提示(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 )

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

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

轉自:http://blog.csdn.net/qter_wd007/article/details/5377882


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM