06 布局管理器

来源:互联网 发布:搜款网服饰网络批发 编辑:程序博客网 时间:2024/06/04 22:53

当一个窗口对象上有多个子窗口对象组成时,我们需要调整它们的显示坐标, 而且窗口大小改变时,子窗口对象的大小也不会自动的改变。
布局管理可以方便的管理子窗口对象, 而且可以实现窗口大小改变时,按比例来改变子窗口对象.

一个布局管理器对象可以装载多个子窗口对象,也要以装载子布局管理器对象。它们之间的坐标会由布局管理器自动安排,而且也可以指定它们之间的显示比例.
一个窗口对象只能指定一个布局管理器对象,但布局管理里可以包含子布局管理器对象.

QVBoxLayout
是垂直布局管理器, 也就是垂直地按排子窗口对象。
例如:创建一个窗口对象, 上面有一个微调框, 进度条和滚动条:
main.cpp:

#include <QApplication>#include <QWidget>#include <QSpinBox>#include <QProgressBar>#include <QSlider>#include <QVBoxLayout>class MyWin : public QWidget {private:    QVBoxLayout *vlayout;    QSpinBox    *box;    QProgressBar *bar;    QSlider      *slider;public:    MyWin();    ~MyWin();};MyWin::MyWin(){    vlayout = new QVBoxLayout(this); //创建布局管理器对象,并指定此窗口对象使用此布局管理器    box = new QSpinBox; //微调框    bar = new QProgressBar;  //  进度条    slider = new QSlider(Qt::Horizontal); // 滚动条    //增加子窗口对象    vlayout->addWidget(box, 2); //增加微调框对象,并指定它占用的比例为20%    vlayout->addWidget(bar, 5); //增加进度条对象,指定它占50%    vlayout->addWidget(slider, 3);    //默认情况下,子窗口组件都是高度固定,需要设置允许垂直扩展都会随随着布局管理变化    box->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    bar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    slider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    //当QSpinBox对象的值发生改变时,进度条和滚动条的值跟着变    connect(box, SIGNAL(valueChanged(int)), bar, SLOT(setValue(int)));    connect(box, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));    //当滚动条拖动时,微调框与进度条的值跟着改变    connect(slider, SIGNAL(valueChanged(int)), bar, SLOT(setValue(int)));    connect(slider, SIGNAL(valueChanged(int)), box, SLOT(setValue(int)));}MyWin::~MyWin(){    delete slider;    delete bar;    delete box;    delete vlayout;}int main(int argc, char *argv[]){    QApplication a(argc, argv);    MyWin win;    win.show();    return a.exec();}

再如一个窗口对象上,需要6个按钮,三个一行,其中第一行占窗口的60%大小,每行中间的按钮占行的80%大小.

main.cpp

#include <QApplication>#include <QWidget>#include <QPushButton>#include <QVBoxLayout>#include <QHBoxLayout>#define COUNT  6class MyWin : public QWidget {private:    QPushButton *btns[COUNT];    QHBoxLayout *hlayout1, *hlayout2;    QVBoxLayout *vlayout;public:    MyWin(QWidget *parent=NULL);    ~MyWin();};MyWin::MyWin(QWidget *parent) : QWidget(parent){    hlayout1 = new QHBoxLayout;    hlayout2 = new QHBoxLayout;    vlayout = new QVBoxLayout;    for (int i = 0; i < COUNT; i++)    {        btns[i] = new QPushButton;        btns[i]->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    }    hlayout1->addWidget(btns[0], 1);    hlayout1->addWidget(btns[1], 8);    hlayout1->addWidget(btns[2], 1);    hlayout2->addWidget(btns[3], 1);    hlayout2->addWidget(btns[4], 8);    hlayout2->addWidget(btns[5], 1);    vlayout->addLayout(hlayout1, 6);    vlayout->addLayout(hlayout2, 4);    this->setLayout(vlayout);}MyWin::~MyWin(){    for (int i = 0; i < COUNT; i++)        delete btns[i];    delete hlayout1;    delete hlayout2;    delete vlayout;}int main(int argc, char *argv[]){    QApplication a(argc, argv);    MyWin win;    win.show();    return a.exec();}

除了垂直/水平布局管理器外,QFormLayout, QGridLayout, and QStackedLayout

0 0
原创粉丝点击