1. 程式人生 > >Qt5 佈局管理器

Qt5 佈局管理器

所謂 GUI 介面,歸根結底,就是一堆元件的疊加。我們建立一個視窗,把按鈕放上面,把圖示放上面,這樣就成了一個介面。在放置時,元件的位置尤其重要。我們必須要指定元件放在哪裡,以便視窗能夠按照我們需要的方式進行渲染。這就涉及到元件定位的機制。Qt 提供了兩種元件定位機制:絕對定位和佈局定位。

 

顧名思義,絕對定位就是一種最原始的定位方法:給出這個元件的座標和長寬值。這樣,Qt 就知道該把元件放在哪裡以及如何設定元件的大小。但是這樣做帶來的一個問題是,如果使用者改變了視窗大小,比如點選最大化按鈕或者使用滑鼠拖動視窗邊緣,採用絕對定位的元件是不會有任何響應的。這也很自然,因為你並沒有告訴 Qt,在視窗變化時,元件是否要更新自己以及如何更新。如果你需要讓元件自動更新——這是很常見的需求,比如在最大化時,Word 總會把稿紙區放大,把工具欄拉長——就要自己編寫相應的函式來響應這些變化。或者,還有更簡單的方法:禁止使用者改變視窗大小。但這總不是長遠之計。

針對這種變化的需求,Qt 提供了另外的一種機制——佈局——來解決這個問題。你只要把元件放入某一種佈局,佈局由專門的佈局管理器進行管理。當需要調整大小或者位置的時候,Qt 使用對應的佈局管理器進行調整。下面來看一個例子:

#include "mainwindow.h"
#include <QApplication>
#include<QSpinBox>
#include<QSlider>
#include<QHBoxLayout>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    /*MainWindow w;
    w.show();*/
   QWidget window;
       window.setWindowTitle("Enter your age");
       QIcon icon(":/images/pic.png");
       window.setWindowIcon(icon);
       QSpinBox *spinBox = new QSpinBox(&window);
       QSlider *slider = new QSlider(Qt::Horizontal, &window);
       spinBox->setRange(0, 130);
       slider->setRange(0, 130);

       QObject::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);
       void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
       QObject::connect(spinBox, spinBoxSignal, slider, &QSlider::setValue);
       slider->setValue(35);

       QHBoxLayout *layout = new QHBoxLayout;
       layout->addWidget(spinBox);
       layout->addWidget(slider);
       window.setLayout(layout);

       window.show();
    return a.exec();
}

執行結果:

參考連結:https://www.devbean.net/2012/09/qt-study-road-2-layout/