




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第 11 章 布局管理本章重點在窗體中擺放窗口部件的方法布局的基本概念和分類基本布局的創(chuàng)建方法和步驟堆棧窗體的創(chuàng)建和使用切分窗口的創(chuàng)建和使用各種布局方式的綜合使用如何優(yōu)化布局結(jié)構(gòu)布局管理的經(jīng)驗總結(jié)放置在窗體中的每一個窗口部件都必須有一個合適的大小和位置,并且它們應(yīng)該能夠隨著程序自身的辯護做出響應(yīng)而不改變整體的布局結(jié)構(gòu)。Qt4 提供了多種用于在窗體中擺放窗口部件的類:QHBoxLayout、QVBoxLayout、QGridLayout、QFormLayout 和QStackedLayout。這些類簡單易用,幾何每個 Qt 開發(fā)都會用到它們-或者直接在源代碼中,或者通過 Qt Designer。
2、在這一章里,學(xué)習(xí)如何使用 Qt4 中基本的布局管理器以及棧部件和器部件來完成一些比較復(fù)雜的布局。可以執(zhí)行布局管理功能的其他類還有 QSplitter、QScrollArea、QMainWindow 和QMdiArea 等。這些類所擁有的共同點在于它們提供了一種用戶可以靈活掌控的布局方式。例如,QSplitter 就提供了一個切分窗口拖動條(splitter bar),通過拖拽它,用戶可以改變窗口部件的大小。QMdiArea 則為多文檔界面(multiple document interface,MDI)提供了支持。它們經(jīng)常適合用作布局類的替換方式,在本章中講述其中的部分內(nèi)容。11.1 基本概念
3、和方法Qt 布局管理器是 Qt 圖形用戶界面設(shè)計的基本內(nèi)容,在前面的幾章中也斷斷續(xù)續(xù)的講到了Qt 的布局管理器的使用,也做了一些簡單的應(yīng)用。本小節(jié)將詳細介紹 Qt 的布局管理器,詳細闡述 Qt 布局管理器的一些特性。11.1.1 擺放窗口部件的方法Qt 提供了幾種在窗口部件上管理子窗口部件的基本方式。一共有 3 種方法用于管理窗體上子窗口部件的布局:絕對位置法、人工布局法和布局管理器法。相比于使用固定和位置,布局提供了功能強大且極具靈活性的另案。使用布局后,編程字體的要求。無需計算和位置,布局可以自動進行調(diào)整,符合用戶屏幕、語言以及1.絕對位置法這種方法是最原始的擺放窗口部件的方法,甚至都不能
4、稱其為“擺放”。它對窗體的各個子窗口部件分配固定的大小和位置,是通過調(diào)用基類 QWidget 提供的setGeometry()函數(shù)來實現(xiàn)的。絕對位置法有很多缺點:用戶無法改變窗口的大小,當(dāng)父窗口改變時,子窗口不能做出相應(yīng)的調(diào)整。如果用戶選擇了一種不大常用的大字體,或者當(dāng)應(yīng)用程序被翻譯成另外一種語言時,也許會把一些文本截斷。對于某些風(fēng)格的平臺,這些窗口部件可能會具有并不合適的大小。必須人工計算這些位置和大小。這樣做不僅非??菰锒覙O易出錯,并且還會讓后期的維護工作變得痛苦萬分。很顯然,使用這種方式管理 GUI 應(yīng)用程序大大降低了程序員的開發(fā)效率,降低了應(yīng)用程序的質(zhì)量和適應(yīng)性。2.人工布局法這種方
5、法的是通過重載 QWidget:resizeEvent(QResizeEvent*)函數(shù)來使得子窗口的的大小總是和父窗口的大小成比例,也就在一定程度上減輕了計算量,但是在其中也要通過 setGeometry()函數(shù)來設(shè)置子窗口部件的位置和大小。在程序的規(guī)模比較小,并且不需要時常變更設(shè)計的情況下,絕對位置法勉強可以勝任。但是它就像前面的絕對位置法一樣,仍然需要計算許多手寫代碼中的常量,尤其是當(dāng)設(shè)計被改變的時候,這種情況更加突出,而且它并沒有消除文本會被截斷的。輔以自子窗口部件的大小提示,應(yīng)該可以規(guī)避這種風(fēng)險,但是這樣會使代碼變得尤為復(fù)雜。3.布局管理器法這種方式是使用 Qt 設(shè)計用戶界面、組織管
6、理 Qt 窗口部件的最好方法。布局管理器為窗口部件提供了有感知的默認(rèn)值( sensible default sizes),可以隨著窗口部件大小的變化,對子窗口部件的大小和位置做出適當(dāng)?shù)恼{(diào)整。11.1.2 布局管理器Qt 的布局管理器負(fù)責(zé)在父才窗口部件區(qū)域內(nèi)構(gòu)建子窗口部件。這些管理器可以使其中的窗口部件自動并重新調(diào)整子窗口部件、保持窗口部件敏感度最小化的變化和默認(rèn)尺寸,并可在內(nèi)容或文本字體更改時自動重新。在 Qt Designer 中,完全可以使用布局管理器來控件。圖 1-1 顯示了使用了頂層布局管理器的應(yīng)用程序在不同下的情形,可以看到,由于布局管理器的存在,使得窗口部件保持了整體的布局。圖 1
7、1-1a圖 11-1b圖 11-1 以不同顯示的同一框1.布局類的繼承關(guān)系QLayout 類是Qt 的幾何管理器的基類,它派生自 QObject 類和QLayoutItem 類,是一個抽象基類,必須被派生類所重新實現(xiàn)。它的派生類主要有 QBoxLayout, QGridLayout, QFormLayout 以及 QStackedLayout。而QBoxLayout又有兩個主要的 Qt4 子類,QHBoxLayout 和QVBoxLayout。它們之間的繼承關(guān)系如圖 11-2 所示,圖中的抽象類用斜體表示。QLayout圖 11-2 Qt4 布局管理器類繼承關(guān)系圖QVBoxLayoutQHBo
8、xLayoutQStackedLayoutQFormLayoutQBoxLayoutQGridLayoutQLayoutItemQObjectQLayout 也提供了一些有用的方法,如 setSizeConstraint() 和set我們很少會用到它們。Bar()等,但是2.內(nèi)建布局管理器Qt 的內(nèi)建布局管理器可以將窗口部件以及其他布局排列為橫向,縱向,網(wǎng)格以及表單中。如前所述,在截至目前的 Qt 4.5 中,主要提供了 5 種內(nèi)建的布局管理器。 水平布局管理器(QHBoxLayout)按從的順序?qū)⒐芾淼拇翱诓考M放在一行中。圖 11-3 顯示了使用水平布局管理器的窗口的大致情形。圖 11-3
9、 使用 QHBoxLayout 布局管理器排列的窗口部件 垂直布局管理器(QVBoxLayout)按從上至下的順序?qū)⒐芾淼拇翱诓考Q放在一列中。圖 11-4 顯示了使用水平布局管理器的窗口的大致情形。圖 11-4 使用 QVBoxLayout 布局管理器排列的窗口部件 柵格布局管理器(QGridLayout)把管理的窗口部件放在可擴展的單元格中,這樣一來,多個單元。必要, 窗口部件可以圖 11-5 顯示了使用水平布局管理器的窗口的大致情形。圖 11-5 使用QGridLayout 布局管理器排列的窗口部件 表單布局管理器(QFormLayout)表單布局管理器主要用作管理界面上的輸入窗口部件(
10、 input widgets)以及和它們相窗口部件(labels)。連的圖 11-6 顯示了使用水平布局管理器的窗口的大致情形。圖 11-6 使用QFromLayout 布局管理器排列的窗口部件 棧布局管理器(QStackedLayout)按照一種類似于棧的方式排列窗口部件,在某一時刻只有一個窗口部件是可見的。圖 11-7 顯示了使用水平布局管理器的窗口的大致情形。圖 11-7 使用 QStackedLayout 布局管理器排列的窗口部件小貼士:截至目前的 4.5.2 版,Qt Designer 的窗口部件盒沒有可視化的提供對棧布局管理器的支持,不過它提供了一個棧部件 QStackedWidg
11、et,作用與棧布局管理器類似。因此, 在使用 Qt Designer 繪制GUI 界面時,完全可以使用 QStackedWidget 來代替QStackedLayout。每個內(nèi)建布局管理器均支持窗口部件在分配的范圍內(nèi)橫向/縱向?qū)R,這樣只需使用簡單的布局和對齊屬性,即可自定義用戶界面的外觀。除了上述內(nèi)建的布局管理器外,器也是一種常見的布局管理器,它是由 QSplitter類實現(xiàn)的。在 Qt Designer 的窗口部件盒中也沒有為它提供可視化的部件,不過卻提供了鼠標(biāo)右鍵上下文菜單項來實現(xiàn)該布局。在 Qt 4.5 的后續(xù)版本中,它有望“轉(zhuǎn)正”,成為正式的內(nèi)建布局管理器。在本章后面的內(nèi)容中會詳細的
12、講到如何使用器布局。器布局又分為形。器水平布局和器垂直布局,圖 11-8 和圖 11-9 分別顯示了它們的大致情圖 11-8 使用器水平布局管理器排列的窗口部件圖 11-9 使用器垂直布局管理器排列的窗口部件在實際的應(yīng)用程序開發(fā)中,很少有只用到單一布局的情況,多數(shù)情況下需要組合或者嵌套應(yīng)用布局。Qt4 中的各種布局可以被組合或嵌套至任意的級別中,在后面的例子中將為大家展示如何將基本布局綜合使用起來。11.1.3 優(yōu)化布局結(jié)構(gòu)在迄今為止講到每一個例子中,我們只是簡單的把窗口部件放置到某個確定的布局中。但在某些情況下,由此形成的布局看起來可能還不是我們最想要的形式。在這些情形中,可以通過改變要擺放
13、的窗口部件的大小策略和大小提示來調(diào)整布局。1.大小提示(size hint)和最小大小提示(minimum size hint)在介紹 Qt 窗口部件的大小策略之前,首先介紹大小提示( size hint)和最小大小提示(minimum size hint)。 大小提示大小提示是 Qt 為一個窗口部件推薦的。當(dāng) Qt GUI 窗口部件進行初始化時,將通過QWidget:sizeHint()來獲得窗口部件的大小提示,這是一個虛函數(shù),它的原型為:在未被重載的情況下,它的返回值是這樣的:virtual QSize sizeHint () const如果該窗口部件不屬于任何布局管理器,那么該函數(shù)將返回
14、一個無效的值;如果該窗口部件屬于某個布局管理器,那么該函數(shù)將返回一個該布局管理器認(rèn)為比較合適的。最小大小提示最小大小提示(minimum size hint)是Qt 為窗口部件推薦的最小則是:,它的使用規(guī)如果需要繪制的窗口部件的(包括長和高兩個方面)小于其最小提示(這在 QtDesigner 中往往表現(xiàn)為有些被壓縮的看不到它的內(nèi)容),并且該窗口部件的最小提示在最大和最小的范圍內(nèi),那么該窗口部件顯示的將是其最小提示的值。設(shè)置窗口部件的最小大小提示是通過 QWidget:minimumSizeHint()完成的。它的返回值有如下情景: 如果該窗口部件沒有布局管理器,該函數(shù)返回一個無效的值; 如果該
15、窗口部件屬于某個布局管理器,該函數(shù)返回布局管理器認(rèn)為合適的一個尺寸。2.大小策略(size policy)一個窗口部件的大小策略會告訴布局系統(tǒng)應(yīng)該如何對它進行拉伸或收縮。 Qt 為它所有的內(nèi)置窗口部件都提供了合理的默認(rèn)大小策略值,但是由于不可能為每一種可能產(chǎn)生的布局都提供唯一的默認(rèn)值,所以在一個窗體中,開發(fā)改變它上面的一個或兩個窗口部件的大小策略是非常普遍的現(xiàn)象。一個 QSizePolicy 既包含一個水平分量也包含一個垂直分量。以下是一些常用的取值:表 11-1 枚舉值QSizePolicy:Policy 的內(nèi)容枚舉常量值說明QSizePolicy:Fixed0大小提示是該窗口部件的唯一選擇
16、,所以它發(fā)生任何的伸縮。QSizePolicy:MinimumGrowFlag大小提示是該窗口部件的最小,它變得更 小,但它可以變得更大,不過采用該策略的窗口部件在“爭奪”空間上不占優(yōu)勢。QSizePolicy:umShrinkFlag大小提示是該窗口部件的最大 ,也就是該窗口部件 比大小提示的 更大。該窗口部件可以在沒有受到其它窗口部件“要求”的情況下,自由的縮小。QSizePolicy:PreferredGrowFlag | ShrinkFlag一般情況下,該窗口部件會將大小提示作為它的優(yōu)先和最佳選擇,但它也可以變得足夠的小,也可以變表 11-1 中的“值”這一列實際上告訴了我們每一種策略
17、一般是具有“傾向性”的,比如QSizePolicy:Fixed 的值為 0,則它“傾向于”保持的大小不變,即保持大小提示的。而 QSizePolicy:Expanding 的值是 3 個值的疊加,總的“傾向性”是趨于占用更間的,等等。這就為當(dāng)多個具有不同大小策略的窗口部件放置在一起時,如何它們占用空間的模式提供了基本的依據(jù),以下是幾種常見的組合。 相同大小策略的窗口部件被布局管理器組合在一起。在這種情況下,除了窗口部件不能超出它的大小范圍外,不同的窗口部件可以按伸縮。的伸縮因子在其的范圍的 QSizePolicy:Fixed 和任何其他的大小策略組合在一起。具有QSizePolicy:Fixe
18、d 大小策略的窗口部件其大小是不變的,即保持在 sizeHint()大小,而其他的窗口部件可以在的范圍伸縮。 QSizePolicy:Preferred 和QSizePolicy:Expanding 組合在一起。具有QSizePolicy:Preferred策略的窗口部件其大小是不變的,即它認(rèn)為大小提示是最適合它的,而其他的窗口部件大小可以在其的范圍伸縮。 QSizePolicy:Ignored 和其他策略(QSizePolicy:Fixed 策略除外)組合在一起的時候,不同的窗口部件在各自的范圍伸縮。 QSizePolicy:Preferred,QSizePolicy:Minimum 和QS
19、izePolicy:在一起的時候,各窗口部件在各自的范圍內(nèi)可以自由伸縮。um 組合3.伸縮因子(stretch factor)除了大小策略中包含的水平方向和垂直方向兩個分量之外, QSizePolicy 類還保存了水平方向和垂直方向的一個伸縮因子。這些伸縮因子可以用來說明在增大窗體時,對不同的子窗口部件應(yīng)使用的不同放大比例。即需要設(shè)置 QSizePolicy:horizontalStretch 和大,但不占優(yōu)勢。該策略是 QWidget 窗口部件默認(rèn)的策略。QSizePolicy:ExpandingGrowFlag | ShrinkFlag | ExpandFlag采用該策略的窗口部件也能夠感
20、覺到 提示,但是它傾向于盡可能的占用更大的空間,該窗口部件也可以變得足夠小。QSizePolicy:MinimumExpandingGrowFlag | ExpandFlag大小提示將是該窗口部件的最小,該窗口部件將盡可能的占用的空間。該策略已經(jīng)不再被推薦使用,建議用Expanding 替代它,并且重載minimumSizeHint()。QSizePolicy:IgnoredShrinkFlag | GrowFlag | IgnoreFlag與Expanding 有些相似,只是所有的大小提示都被忽略,該窗口部件將會盡可能的占用空間。QSizePolicy:verticalStretch 的值來
21、實現(xiàn)。默認(rèn)情況下,被布局管理器組合在一起的窗口部件的伸縮因子是相等的,都為 0。此時,在所有的窗口部件都沒有超出各自的大小范圍的情況下,窗口部件的大小始終相等。例如,假定在一個 QListWidget 的右面還有一個 QTextEdit,并且希望這個 QTextEdit 的長度能夠是 QListWidget 長度的兩倍,那么就可以把這個 QTextEdit 在水平方向上的拉伸因子(QSizePolicy:horizontalStretch)設(shè)置為 2,而把 QListWidget 在水平方向上的拉伸因子(QSizePolicy:horizontalStretch)設(shè)置為 1;垂直方向上保持默認(rèn)
22、為 0,即兩者一樣的高。這樣設(shè)置的效果如圖 11-10 所示。圖 11-10 設(shè)置伸縮因子后窗體的效果4.大小約束(size constraint)影響布局方式的另法是設(shè)置它的子窗口部件的最大大小、最小大小或固定大小。這些是通過設(shè)置 sizeConstraint 屬性來完成的。該屬性值是一個枚舉常量,定義了布局的大小約束的模式。表列出了它所有可能的取值,它的默認(rèn)值是QLayout:SetDefaultConstraint。獲取和設(shè)置該屬性值可以通過 QWidget:layout()來獲取主窗口部件的布局管理器,然后可以調(diào)用 QLayout:sizeConstraint()函數(shù)來查看當(dāng)前的設(shè)置情
23、況,然后再通過 QLayout:setSizeConstraint()函數(shù)來設(shè)置該布局管理器的sizeConstraint 屬性。這兩種函數(shù)的原型如下:其中,SizeConstraint 的取值即是在表 11-2 中的枚舉值的范圍內(nèi)。表 11-2 布局管理器的大小約束屬性(QLayout:SizeConstraint)可能的取值常量值說明QLayout:SetDefaultConstraint0主窗口部件的最小設(shè)置為minimumSize(),除非該窗口部件已經(jīng)有一個最小QLayout:SetFixedSize3主窗口部件的設(shè)置為sizeHint(),并且不改變該窗口部件的QLayout:Se
24、tMinimumSize2主窗口部件的最小設(shè)置為minimumSize(),并且該窗口部件不能夠變得更小QLayout:SetumSize4主窗口部件的最大設(shè)置為umSize(),并且該窗口部件不能夠變得更大QLayout:SetMinAndMaxSize5主窗口部件的最小設(shè)置為minimumSize(),最大設(shè)置為SizeConstraint sizeConstraint () const void setSizeConstraint ( SizeConstraint )5.空白(margin)和間距(spacing)每種布局兩個重要的屬性,空白和間距??瞻字傅氖钦麄€布局四周距離窗體邊緣的距
25、離;間距指的是布局管理器內(nèi)部各個窗口部件之間的距離??瞻讓傩约?margin(),間距屬性即 spacing(),它們的默認(rèn)值是有窗體的風(fēng)格決定的。Qt 的默認(rèn)風(fēng)格下,子窗體部件的 margin()的值是 9 英寸,窗體的 margin()值是 11 英寸。spacing()的值與margin()相同。如果要設(shè)置這兩個值可以通過 setMargin()和 setSpacing()。注意,從 Qt4.3 開始,margin()屬性已經(jīng)逐漸不再被 Qt4 所推薦,更好的設(shè)置空白的方法是使用 setContentsMargins()方法,它的原型如下:其中,left, top, right, 和 b
26、ottom 表示環(huán)繞在布局周圍的空白。對于QGridLayout 和QFormLayout,不要使用 setSpacing()方法,而是要分別使用setHorizontalSpacing()和 setVerticalSpacing()方法來設(shè)置水平和垂直方向的間距。如果你使用了 setSpacing()方法,獲取 spacing()時,它的返回值將為-1。11.2 在 Qt Designer 中使用布局為了確保界面元素在應(yīng)用程序程序在運行示,我們需要把它們放進布局當(dāng)中去。被預(yù)覽時的各種狀態(tài)下都能夠正常顯11.2.1 應(yīng)用和破除布局應(yīng)用布局的最簡單做法是選中界面元素,使用工具欄上的按鈕、鼠標(biāo)右鍵
27、的上下文菜單,以及【Form】菜單都可以實現(xiàn)。一旦界面元素被放進一個布局之中,它就不能單獨自由行動了-你不可以單獨改變它的大小,因為布局接管了這一工作,它了位于其中的界面元素的幾何以及間隔器的大小策略提示(size hint)。所以你要么破除布局,人工調(diào)整界面元素的大小,要么通過調(diào)整布局的大小來間接調(diào)整界面元素的大小。要破除一個布局,可以使用快捷鍵 Ctrl+0 或者通過鼠標(biāo)右鍵上下文菜單以及主菜單項或工具欄按鈕。在一個布局完成之后,你仍然可以向其中添加或刪除間隔器來影響布局內(nèi)部的窗口部件的幾何,最為便捷的方式是從部件選擇器中拖出一個間隔器,并把它拖入到布局之中,刪除的時候則相反,把間隔器從布
28、局中拖出來即可。1. 向布局中增加窗口部件void QLayout:setContentsMargins ( int left, int top, int right, int bottom )umSize()QLayout:SetNoConstraint1主窗口部件的大小受到約束如圖 11-11 所示,要向一個已經(jīng)存在的布局中增加窗口部件,只需要選中并拖動該窗口部件,把它從當(dāng)前位置拖進布局之中,并在認(rèn)為合適的位置放開鼠標(biāo)。注意,當(dāng)你的拖動窗口部件在布局上方停留時,布局內(nèi)部會顯示一條布局中的位置。的線,它提示了你的窗口部件未來在圖 11-11 向布局中增加窗口部件2. 設(shè)置一個頂級布局(Top
29、 Level Layout)設(shè)置界面的頂級布局是很有必要的,它能確保窗口界面元素在應(yīng)用程序的各種狀態(tài)下均能夠保持適當(dāng)?shù)拇笮?。要設(shè)置頂級布局,需要用鼠標(biāo)左鍵選中該 Form,然后使用快捷鍵或工具欄或者主菜單項來選中一種布局。如何驗證已經(jīng)設(shè)置了頂級布局呢,簡單的做法就是在 Qt Designer 的預(yù)覽窗口(按下Ctrl+R 鍵)中,使用鼠標(biāo)左鍵拖動窗口的邊緣手柄,查看界面元素的變化情況。如果一切正常,那就表示你已經(jīng)設(shè)置過了。還有一種做法,就是用鼠標(biāo)左鍵點擊界面表單(你的Form),然后在對象查看器中,如果看到 Form 前面有常見的幾種布局圖標(biāo)之一(圖 11-12 中是垂直布局),那么就表示你已
30、經(jīng)設(shè)置了頂級布局,如圖 11-12 所示;反之,如果 Form 前面的圖標(biāo)右下角帶有一個紅色的停止標(biāo)志,就表示還沒有設(shè)置頂級布局,如圖 11-13 所示。圖 11-12 在對象查看器中瀏覽頂級布局-存在頂級布局圖 11-13 在對象查看器中瀏覽頂級布局-不存在頂級布局3. 應(yīng)用一個布局要應(yīng)用一個布局,你可以使用工具欄上的按鈕,如圖 11-14 所示,也可以使用鼠標(biāo)右鍵的上下文菜單,如圖 11-15 所示。圖 11-14 使用工具欄按鈕應(yīng)用一個布局圖 11-15 使用鼠標(biāo)右鍵的上下文菜單來應(yīng)用一個布局11.2.2 快捷鍵除了使用標(biāo)準(zhǔn)工具欄以及上下文菜單,我們還可以使用快捷鍵來對布局進行操作。表1
31、1-3 顯示了常見的布局操作所對應(yīng)的快捷鍵。表 11-3 布局的快捷鍵11.3 基本布局實踐基本布局主要包括:水平布局、垂直布局、柵格布局和表單布局這 4 種。在講解水平布局和垂直布局之前,還要重點說一下它們的父類-QBoxLayout,它也是使用比較多的,并且包含了水平布局和垂直布局的一些共性特點。1.QBoxLayout布局快捷鍵說明水平布局Ctrl+1 將選中的界面元素置于一個水平布局中垂直布局Ctrl+2 將選中的界面元素置于一個垂直布局中柵格布局Ctrl+5 將選中的界面元素置于一個柵格布局中表單布局Ctrl+6 將選中的界面元素置于一個表單布局中器水平布局 Ctrl+3 創(chuàng)建一個器
32、水平布局,并將選中的界面元素置于其中器垂直布局 Ctrl+4 創(chuàng)建一個器垂直布局,并將選中的界面元素置于其中調(diào)整大小Ctrl+J 調(diào)整布局的大小,以使得位于其中的元素能夠恰當(dāng)?shù)娘@示自身內(nèi)容。關(guān)于這方面的內(nèi)容,可以參見QWidget:adjustSize()函數(shù)破除布局Ctrl+0 破除選中的布局使用QBoxLayout 類可以創(chuàng)建一個布局,能夠把其中的窗口部件水平的或者垂直的按照直線排列。之所以取名為“Box”,是由于 QBoxLayout 類把位于其內(nèi)的空間均勻的劃分成若干個“盒子”,并把各個窗口部件都放入一個盒子里面。使用QBoxLayout 創(chuàng)建的布局是有方向性的,主要是有水平和垂直兩個
33、方向。當(dāng)給定其方向參數(shù)為 Qt:Horizontal 時,即表示水平方向,位于其中的窗口部件將水平排列成一的大小。當(dāng)給定方向參數(shù)為 Qt:Vertical 時,窗口部件將按行,并且它們都會找到適合照垂直直線排列。布局內(nèi)的其余空間是共享的,它們的factors)來確定??梢杂缮炜s因子( stretch使用QBoxLayout 類來創(chuàng)建一個布局是很容易的,做法是直接調(diào)用其構(gòu)造函數(shù),其原型如下:該構(gòu)造函數(shù)它有兩個參數(shù),一個是布局的方向,一個是父窗口指針,默認(rèn)為 0 即當(dāng)前窗口。布局的方向枚舉值如表 11-4 所示。表 11-4 QBoxLayout 的方向枚舉值一個實例代碼如下:/第 1 步QWid
34、get *window = new QWidget;QPushButton *button1 = new QPushButton(tr("One"); QPushButton *button2 = new QPushButton(tr("Two"); QPushButton *button3 = new QPushButton(tr("Three"); QPushButton *button4 = new QPushButton(tr("Four"); QPushButton *button5 = new QPus
35、hButton(tr("Five");/第 2 步QBoxLayout *layout = new QBoxLayout(QBoxLayout:LeftToRight,0);/第 3 步layout->addWidget(button1);常量值說明QBoxLayout:LeftToRight0從左到右水平排列QBoxLayout:RightToLeft1從右到左水平排列QBoxLayout:TopToBottom2從上到下垂直排列QBoxLayout:BottomToTop3從下到上垂直排列QBoxLayout:QBoxLayout ( Direction dir,
36、 QWidget * parent = 0 )創(chuàng)建這種布局的一般步驟是:第 1 步,創(chuàng)建要使用的窗口部件。第 2 步,創(chuàng)建布局,并指定其方向和父窗口。第 3 步,將窗口部件依次加入到布局中。第 4 步,為應(yīng)用程序程序窗口設(shè)置布局。如上代碼所示,在其中通過注釋指出了各步驟對應(yīng)的代碼行。這段代碼將創(chuàng)建 1 個名為window 的應(yīng)用程序窗口,1 個名為 layout 的 QBoxLayout 實例,以及 5 個按鈕,布局方向是從左到右的水平方向。圖 11-16 顯示了這個實例的效果,你會發(fā)現(xiàn)它與使用水平布局的效果是一樣的。圖 11-16 使用QBoxLayout 類創(chuàng)建的布局效果當(dāng)然,在實際應(yīng)用中
37、,我們大多數(shù)情況下會直接使用 QBoxLayout 的兩個派生類,水平布局和垂直布局,它們更加方便而且有性。11.3.2 水平布局水平布局把在其中的窗口部件按照一條直線水平排列。QHBoxLayout 類用來創(chuàng)建水平布局的實例。一個簡單的手寫代碼創(chuàng)建水平布局的實例如下:QWidget *window = new QWidget;QPushButton *button1 = new QPushButton(tr("One"); QPushButton *button2 = new QPushButton(tr("Two");layout->addWi
38、dget(button2); layout->addWidget(button3); layout->addWidget(button4); layout->addWidget(button5);/第 4 步window->setLayout(layout);/顯示窗口window->show();使用手寫代碼創(chuàng)建水平布局大體需要下面這些步驟:第 1 步,創(chuàng)建布局內(nèi)的窗口部件。第 2 步,創(chuàng)建一個水平布局的實例,也就是創(chuàng)建一個 QHBoxLayout 的實例,并將第 1步創(chuàng)建的窗口部件加入到該布局之中。第 3 步,調(diào)用 QWidget:setLayout()函數(shù)將
39、該布局安裝到窗體上。設(shè)置了布局之后,在該布局內(nèi)的窗口部件將以 window 作為它們的父窗口。該實例的效果如圖 11-17 所示:圖 11-17 水平布局效果11.3.3 垂直布局垂直布局把位于其中的窗口部件按照一條直線垂直排列。QVBoxLayout 類用來創(chuàng)建一個垂直布局的實例。一個簡單的使用手寫代碼創(chuàng)建垂直布局的實例如下:QWidget *window = new QWidget;QPushButton *button1 = new QPushButton("One"); QPushButton *button2 = new QPushButton("Two
40、"); QPushButton *button3 = new QPushButton("Three"); QPushButton *button4 = new QPushButton("Four"); QPushButton *button5 = new QPushButton("Five");QPushButton *button3 = new QPushButton(tr("Three"); QPushButton *button4 = new QPushButton(tr("Four&qu
41、ot;); QPushButton *button5 = new QPushButton(tr("Five");QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(button1);layout->addWidget(button2); layout->addWidget(button3); layout->addWidget(button4); layout->addWidget(button5);window->setLayout(layout); window->s
42、how();使用手寫代碼創(chuàng)建垂直布局大體需要下面這些步驟:第 1 步,創(chuàng)建布局內(nèi)的窗口部件第 2 步,創(chuàng)建一個垂直布局的實例,也就是創(chuàng)建一個 QVBoxLayout 類的實例,并將第 1步創(chuàng)建的窗口部件加入到該布局之中第 3 步,調(diào)用 QWidget:setLayout()函數(shù)將該布局安裝到窗體上。設(shè)置了布局之后,在該布局內(nèi)的窗口部件將以 window 作為它們的父窗口。該實例的效果如圖 11-18 所示:圖 11-18 垂直布局實例效果水平和垂直布局可以嵌套、組合使用,并且可至任意的深度。但在比較復(fù)雜的情況下,使用柵格布局往往是更理想的做法。11.3.4 柵格布局柵格布局將位于其中的窗口部件
43、放入一個網(wǎng)狀的柵格之中。柵格布局是這樣工作的:它計算了位于其中的空間,然后將它們合理的劃分成若干個行( row)和列(column),并QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(button1);layout->addWidget(button2); layout->addWidget(button3); layout->addWidget(button4); layout->addWidget(button5);window->setLayout(layout); window->
44、;show();把每個由它管理的窗口部件放置在合適的單元之中,這里所指的單元( cell)即是指由行和列交叉所劃分出來的空間。在使用柵格布局之前,需要在代碼中包含如下的件:創(chuàng)建柵格布局的大致步驟如下:第 1 步,創(chuàng)建布局內(nèi)的窗口部件。第 2 步,創(chuàng)建柵格布局的實例,也就是創(chuàng)建一個 QGridLayout 類的實例,并將第 1 步創(chuàng)建的窗口部件加入到布局之中。第 3 步,調(diào)用 QWidget:setLayout()函數(shù)將布局安裝到窗體上。一個典型的實例代碼如下:我們來講解一下這段代碼??梢悦黠@的看出, QHBoxLayout 和 QVBoxLayout 的用法相當(dāng)簡單明了,但是 QGridLay
45、out 的用法則稍微有些麻煩。QGridLayout 的工作基于一個二維單元格。在這個布局中,左上角的 QLabel 即nameLabel 的位置是(0,0),而與之相應(yīng)的QLineEdit 即nameLineEdit 的位置是(0,1)。以此類推,ageLabel 的位置是(1,0),而ageSpinBox 的位置是(1,1)。它們都占用一列的值。對于QGridLayout:addWidget()的調(diào)用遵循如下的語法形式:其中,widget 是要到布局中的子窗口部件,(row,column)是由該窗口部件所占用的左上角單元格,rowSpan 是該窗口部件要占用的行數(shù),而 column 是該窗
46、口部件要占用的列數(shù)。如果省略了這些參數(shù),則它們將會取默認(rèn)值 1。layout->addWidget(widget,row,column,rowSpan,columnSpan);nameLabel = new QLabel(tr("&Name:"); nameLabel->setBuddy(nameLineEdit);ageLabel = new QLabel(tr("&Age:"); ageLabel->setBuddy(ageSpinBox);QGridLayout *gridLayout = new QGridLay
47、out; gridLayout->addWidget(nameLabel, 0, 0);gridLayout->addWidget(nameLineEdit, 0, 1);gridLayout->addWidget(ageLabel, 1, 0);gridLayout->addWidget(ageSpinBox, 1, 1); setLayout(gridLayout);#include <QGridLayout>該示例的運行效果如圖 11-19 所示。圖 11-19 柵格布局效果在柵格布局中,行和列本質(zhì)上是相同的,只是叫法不同而已。下面列,這些內(nèi)容當(dāng)然也適
48、用于行。重點討論在柵格布局中,每個列(以及行)一個最小寬度( minimum width)以及一個伸縮因子(stretch factor)。最小寬度指的是位于該列中的窗口部件的最小的寬度,而伸縮因子決定了該列內(nèi)的窗口部件能夠獲得多少空間。它們的值可以通過setColumnMinimumWidth()和setColumnStretch()方法來設(shè)置。此外,一般情況下我們都是把某個窗口部件放進柵格布局的一個單元中,但窗口部件有時也可能會需要占用多個單元。這時就需要用到 addWidget()方法的一個重載版本,它的原型如下:這時這個單元將從 fromRow 和 fromColumn 開始,擴展到
49、rowSpan 和 columnSpan 指定的倍數(shù)的行和列。如果 rowSpan 或 columnSpan 的值為-1,則窗口部件將擴展到布局的底部或者右邊邊緣處。小貼士:柵格布局中的某個單元(cell)的長和寬,也可以說是柵格布局的行和列的并不是一樣大小的。如果你想使它們相等,你必須通過調(diào)用 setColumnMinimumWidth()和setColumnStretch()方法來使得它們的最小寬度以及伸縮因子都彼此相等。如果QGridLayout 不是窗體的頂層布局(就是說它不能管理所有的區(qū)域和子窗口部件),那么當(dāng)你創(chuàng)建它的同時,就必須為它指定一個父布局,也就是把它加入到父布局中去,并且
50、在此之前,不要對它做任何的操作。使用 addLayout()方法可以完成這一動作。在創(chuàng)建柵格布局完成后,就可以使用 addWidget(),addItem(),以及 addLayout()方法向其中加入窗口部件,以及其它的布局。void QGridLayout:addWidget ( QWidget * widget, int fromRow, int fromColumn,int rowSpan, int columnSpan,Qt:Alignment alignment = 0 )當(dāng)界面元素較為復(fù)雜時,應(yīng)該毫不猶豫的盡量使用柵格布局,而不是使用水平和垂直布局的組合或者嵌套的形式,因為在多數(shù)
51、情況下,后者往往會使“”更加復(fù)雜而難以控制。柵格布局賦予了界面設(shè)計器更大的自由度來排列組合界面元素,而僅僅帶來了微小的復(fù)雜度開銷。當(dāng)要設(shè)計的界面是一種類似于兩列和若干行組成的形式時,使用表單布局要比柵格布局更為方便些。11.3.5 表單布局表單布局是從 Qt 4.4 開始被引入的。它把布局內(nèi)的界面元素分成兩列,左邊的列通常(label)而右邊的列放置對應(yīng)值的窗口部件,如 line edits,spin boxes 等等,放置如圖 11-20 所示。表單布局在不同的平臺上與本地原生外觀相同,并且支持長的行形式,如表 11-5 所示。圖 11-20 使用表單布局QFormLayout 這個類是從
52、Qt 4.4 以后引入的。在使用該類之前,需要包含如下的件。在QFormLayout 類出現(xiàn)以前,這種類似于兩列布局的情形我們通常使用 QGridLayout來創(chuàng)建。而現(xiàn)在,使用 QFormLayout 則有的優(yōu)勢: 能夠適應(yīng)不同的平臺,并且提供與本地原生平臺一致的觀感舉例來說,在 Mac OS X Aqua 和KDE 平臺上通常要求中的文本是右對,而在Windows 和GNOME 平臺上則要求文本是左對,QFormLayout 能夠很好的自動適應(yīng)。 支持可折疊的長行(當(dāng)其中的文本較多時) Support for wrapping long rows.在便攜式設(shè)備上,文本太長以至于需要折疊的情
53、況比較常見,但既要折疊而又要不影響顯示的效果則是比較的事情?,F(xiàn)在的 QFormLayout 類可以很好的解決這個問題,它會當(dāng)前的情形是否需要折疊以及怎樣折疊才好。表 11-5 顯示了它的折疊策略。表 11-5 QFormLayout 行折疊策略枚舉值#include <QFormLayout> 為創(chuàng)建-(對應(yīng)的)值域這種伙伴(buddy)類型的界面提供了豐富、方便的API通過使用 addRow()函數(shù)(共有 6 種重載形式)或者 insertRow()函數(shù)(也有 6 種重載形式),我們可以簡便的創(chuàng)建一個 QLabel 窗口部件以及它的伙伴窗口部件。一個實例代碼如下:如果同樣的情形使
54、用 QGridLayout 來布局,則代碼如下:對比這兩段代碼就可以發(fā)現(xiàn),它們實現(xiàn)了相同的界面,而使用 QFormLayout 類則更簡單高效,并且不易出錯。表 11-6 顯示了該界面在不同的平臺下的默認(rèn)觀感。表 11-6 表單布局在不同平臺上的默認(rèn)外觀Windows XPMac OS XCleanlooksnameLabel = new QLabel(tr("&Name:"); nameLabel->setBuddy(nameLineEdit);ageLabel = new QLabel(tr("&Age:"); ageLabel
55、->setBuddy(ageSpinBox);QGridLayout *gridLayout = new QGridLayout; gridLayout->addWidget(nameLabel, 0, 0);gridLayout->addWidget(nameLineEdit, 0, 1);gridLayout->addWidget(ageLabel, 1, 0);gridLayout->addWidget(ageSpinBox, 1, 1); setLayout(gridLayout);QFormLayout *formLayout = new QFormLa
56、yout; formLayout->addRow(tr("&Name:"), nameLineEdit); formLayout->addRow(tr("&Age:"), ageSpinBox); setLayout(formLayout);常量值說明QFormLayout:DontWrapRows0值域(即可輸入的文本行)總是在其對應(yīng)的(label)的旁邊,也就是不折疊。這是默認(rèn)的行折疊策略(采用了 Qt 擴展風(fēng)格的情況除外)。QFormLayout:WrapLongRows1將獲得最大的自由空間,與它對應(yīng)的值域則使用剩余的空
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 伺服系統(tǒng)與工業(yè)機器人課件第10章 工業(yè)機器人的運力學(xué)分析
- 守護藍色星球
- 分享護理文獻
- 羊駝創(chuàng)意畫課件
- 山西省平遙縣綜合職業(yè)技術(shù)學(xué)校2024-2025學(xué)年高三第二學(xué)期期終調(diào)研測試文生物試題試卷含解析
- 河北東方學(xué)院《文化人類學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 甘肅省會寧一中2025屆高三下學(xué)期4月月考化學(xué)試題含解析
- 南陽理工學(xué)院《統(tǒng)計分析與軟件應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 唐山學(xué)院《太陽能發(fā)電技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)蒙古化工職業(yè)學(xué)院《企業(yè)戰(zhàn)略思考與行動系列講座》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024福建省能源石化集團有限責(zé)任公司秋季社會招聘120人筆試參考題庫附帶答案詳解
- 吉林省吉林市2024-2025學(xué)年高三下學(xué)期3月三模試題 英語 含答案
- 工程竣工決算編審方案的編制與審核指導(dǎo)
- 國開2025年《會計政策判斷與選擇》形考任務(wù)1-9答案
- 2025年高速公路收費站(車輛通行費收費員)崗位職業(yè)技能資格知識考試題庫與答案
- 大學(xué)生創(chuàng)新創(chuàng)業(yè)知能訓(xùn)練與指導(dǎo)知到智慧樹章節(jié)測試課后答案2024年秋西北農(nóng)林科技大學(xué)
- 中央空調(diào)系統(tǒng)維保服務(wù)報價清單
- 8.3 法治社會 課件高中政治統(tǒng)編版必修三政治與法治
- 初三勵志、拼搏主題班會課件
- 萬科集團績效考核分析—績效管理課程設(shè)計報告
- 計量標(biāo)準(zhǔn)技術(shù)報告_數(shù)字多用表校準(zhǔn)裝置
評論
0/150
提交評論