1. 程式人生 > 其它 >Qt中的佈局管理器

Qt中的佈局管理器

技術標籤:Qt學習QtqtC++

概述:
所謂 GUI 介面,歸根結底,就是一堆元件的疊加。我們建立一個視窗,把按鈕放上面,把圖示放上面,這樣就成了一個介面。在放置時,元件的位置尤其重要。我們必須要指定元件放在哪裡,以 便視窗能夠按照我們需要的方式進行渲染。這就涉及到元件定位的機制。
Qt 提供了兩種元件定位機制:絕對定位和佈局定位。
絕對定位:絕對定位就是一種最原始的定位方法:給出這個元件的座標和長寬值。這樣,Qt 就知道該把元件放在哪裡以及如何設定元件的大小。但是這樣做帶來的一個問題是,如果使用者改變了窗 口大小,比如點選最大化按鈕或者使用滑鼠拖動視窗邊緣,採用絕對定位的元件是不會有任何響應的。這也很自然,因為你並沒有告訴 Qt,在視窗變化時,元件是否要更新自己以及如何更新。如 果你需要讓元件自動更新——這是很常見的需求,比如在最大化時,Word 總會把稿紙區放大,把工具欄拉長——就要自己編寫相應的函式來響應這些變化。或者,還有更簡單的方法:禁止使用者改 變視窗大小。但這總不是長遠之計。

佈局定位:你只要把元件放入某一種佈局,佈局由專門的佈局管理器進行管理。當需要調整大小或者位置的時候,Qt 使用對應 的佈局管理器進行調整。
1,使用滑竿和輸入框雙向資料繫結
比如使用兩個元件,QSpinBoxQSlider來實現相互改變值


    QSpinBox *spin = new QSpinBox(this);
    QSlider *slider = new QSlider(Qt::Horizontal,this);//水平放置一個滑竿
    /*設定變化範圍為0-100*/
   spin->setRange(0, 100);
   slider->setRange(0, 100);
/*連線訊號*/ connect(slider,&QSlider::valueChanged,spin,&QSpinBox::setValue); void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged; connect(spin,spinBoxSignal,slider,&QSlider::setValue); spin->setValue(18); QHBoxLayout *layout = new QHBoxLayout; layout-
>addWidget(spin); layout->addWidget(slider); this->setLayout(layout);

執行結果如下
在這裡插入圖片描述
對於有佈局的元件改變視窗的大小是不影響它的相對位置的;
注意:
低於雙向資料繫結的時候由於函式valueChanged(int i)是過載函式所以要顯示指定或者強制轉換避免編譯錯誤。
2,Qt提供的佈局管理器

<1>水平佈局
QHBoxLayout //按照水平方向從左到右佈局;
<2>垂直佈局
QVBoxLayout:按照豎直方向從上到下佈局;
<3>網格佈局
QGridLayout:在一個網格中進行佈局,類似於 HTML 的 table;
<4>
QFormLayout:按照表格佈局,每一行前面是一段文字,文字後面跟隨一個元件(通常是輸入框),類似 HTML 的 form;
<5>
QStackedLayout:層疊的佈局,允許我們將幾個元件按照 Z 軸方向堆疊,可以形成嚮導那種一頁一頁的效果。