Qt設定視窗內元件的自適應
當我們用Qt Designer設計介面時,有時會面臨這樣一個問題:需要在視窗指定位置放置元件,並且當視窗位置大小改變時,該元件相對其父物件的位置是不變的。
我們剛開始做的可能是在designer中將元件直接拖到我們期望的位置,編譯執行後正是我們想要的結果,但是當我們拖動視窗,使視窗尺寸變化後,發現元件位置改變了,如下面圖2所示。發生這種情況的原因很簡單,直接拖放元件到介面中,不加任何佈局情況下,元件的位置是相對於整個桌面不變的,而當視窗背景圖變化時,兩者自然而然的就不匹配了。
解決這種問題的方法是將元件加入到佈局當中,我們知道佈局共有3種方式:水平佈局、垂直佈局、柵格佈局;這三種佈局方式都能夠使元件在一定程度上保持其相對於父視窗的位置不變,但對於水平和垂直相對位置都要固定的問題來說,用棋盤佈局無疑是相對方便的,棋盤佈局即為QGridLayout,新增元件的程式碼大致如下:
QGridLayout *layout=new QGridLayout;
layout->addWidget(元件);
其中addwidget函式為void QGridLayout::addWidget(QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan,Qt::Alignment alignment = 0 )
addwidget函式的引數,fromRow為元件起始行,fromColumn為元件起始列,rowSpan為元件的所佔行數,columnSpan為元件所佔列數,alignment則為元件的對齊方式。
可通過調整addwidget中元件起始行列、所佔行列來控制組件在整個視窗中所佔的相對大小以及位置,並且能夠實現元件的相互重疊。但是這種方式和我們想要的還不是完全相同,因為這樣也不能
完全保證元件和背景圖的某個位置完全對應,並且窗口布局中某個只存在一個元件時,該元件會佔滿視窗,這時就要用到按比例設定佈局的方法,在designer中,通過改變佈局物件中的layoutRowStretch和LayoutColumnStretch屬性來設定,其中layoutRowStretch中“0”的個數對應共有幾行元件,layoutColumnStretch中“0”的個數對應共有幾列元件,“0”為最初的初始值,通過更改該值(百分比),控制不同位置的元件在整個視窗中的大小與位置。
在本文中,為了將元件控制在指定位置,我們需要在元件周邊放置spacer,水平、垂直方向各兩個,這樣就可以將視窗分為2行2列,然後通過之前所說的layoutRowStretch和
layoutCColumnStretch中對應值的大小,改變元件的位置和大小。
這種方法如果用程式碼實現,示例:
gridLayout->setRowStretch(0, 29);
gridLayout->setRowStretch(1, 3);
gridLayout->setColumnStretch(0, 28);
gridLayout->setColumnStretch(1, 11);
gridLayout->setColumnStretch(2, 6);
視窗元件初始位置是我們期望的元件位置,如圖1所示:
當放大時,元件位置還是原來位置,並沒有跟隨視窗比例改變,如圖2所示:
增加布局以後,把元件放到我們的相對位置,如圖3所示:
增加布局設定以後,我們的元件位置就會隨著視窗的放大縮小等比例放大縮小。且相對位置也會等比例改變,如圖4所示: