06 布局管理器

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

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

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;
        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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值