您的位置:首页 > 编程语言 > Qt开发

06 布局管理器

2017-05-10 16:17 141 查看
当一个窗口对象上有多个子窗口对象组成时,我们需要调整它们的显示坐标, 而且窗口大小改变时,子窗口对象的大小也不会自动的改变。

布局管理可以方便的管理子窗口对象, 而且可以实现窗口大小改变时,按比例来改变子窗口对象.

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

一个窗口对象只能指定一个布局管理器对象,但布局管理里可以包含子布局管理器对象.

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  6
class 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;
bt
4000
ns[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt5 QT布局管理器