當我們用Qt Designer設計界面時,有時會面臨這樣一個問題:需要在窗口指定位置放置組件,並且當窗口位置大小改變時,該組件相對其父對象的位置是不變的,如下面兩幅圖所示
,首先看上面這幅圖,注意button的位置,我們想讓button一直停留在該位置,我們剛開始做的可能是在designer中將button直接拖到該位置,編譯運行后正是我們想要的結果,但是當我們拖動窗口,使窗口尺寸變化后,發現button位置改變了,如下面那副圖所示。發生這種情況的原因很簡單,直接拖放button到界面中,不加任何布局情況下,button的位置是相對於整個桌面不變的,而當窗口背景圖變化時,兩者自然而然的就不匹配了。
解決這種問題的方法是將button加入到布局當中,我們知道布局共有3種方式:水平布局、垂直布局、棋盤布局;這三種布局方式都能夠使組件在一定程度上保持其相對於父窗口的位置不變,但對於水平和垂直相對位置都要固定的問題來說,用棋盤布局無疑是相對方便的,棋盤布局即為QGridLayout,添加組件的代碼大致如下:
QGridLayout *layout=new QGridLayout;
layout->addWidget(button1,0,0,5,10);//這里的參數是隨意填寫
其中addwidget函數為void QGridLayout::addWidget (QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 )
QGridLayout網上有許多資料,這里就不多介紹了。只說一下
addwidget函數的參數,fromRow為組件起始行,fromColumn為組件起始列,rowSpan為組件的所占行數,columnSpan為組件所占列數,alignment則為組件的對齊方式。
可通過調整addwidget中組件起始行列、所占行列來控制組件在整個窗口中所占的相對大小以及位置,並且能夠實現組件的相互重疊。但是這種方式和我們想要的還不是完全相同,因為這樣也不能
完全保證組件和背景圖的某個位置完全對應,並且窗口布局中某個只存在一個組件時,該組件會占滿窗口,這時就要用到按比例設定布局的方法,在designer中,通過改變布局對象中的layoutRowStretch和LayoutColumnStretch屬性來設置,其中layoutRowStretch中“0”的個數對應共有幾行組件,layoutColumnStretch中“0”的個數對應共有幾列組件,“0”為最初的初始值,通過更改該值(百分比),控制不同位置的組件在整個窗口中的大小與位置。
在本文中,為了將button控制在指定位置,我們需要在button周邊放置4個spacer,水平、垂直方向各兩個,這樣就可以將窗口分為3行3列,然后通過之前所說的layoutRowStretch和
layoutCColumnStretch中對應值的大小,改變button的位置和大小。
這種方法如果用代碼實現,示例:
gridLayout->setRowStretch(0, 49);
gridLayout->setRowStretch(1, 4);
gridLayout->setRowStretch(2, 32);
gridLayout->setColumnStretch(0, 38);
gridLayout->setColumnStretch(1, 21);
gridLayout->setColumnStretch(2, 8);
gridLayout->setColumnStretch(3, 32);
setRowStretch()與setColumnStretch的使用就不多說了,manual中一看就會了。