【轉】如何在Qt 4程式中最佳化布局結構-兼回答網友提問

來源:互聯網
上載者:User

標籤:

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

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)可能的取值

 

枚舉常量

說明

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有些相似,只是所有的大小提示都被忽略,該視窗組件將會儘可能的佔用空間。

 

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    作者 qter_wd007

【轉】如何在Qt 4程式中最佳化布局結構-兼回答網友提問

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.