布局管理器的使用

这里写图片描述

布局管理类 介绍:

**- QHBoxLayout 水平布局
- QVBoxLayout 垂直布局
- QGridLayout 网格布局
- QStackedLayout 把子控件进行分组或者分页,一次只显示一组或者一页,隐藏其他组或者页上的控件。**


布局管理中结合控件的sizePolicy属性,进行调整

结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。

控件的sizePolicy说明控件在布局管理中的缩放方式。Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。一个QSizePolicy的所有变量对水平方向和垂直方向都适用。下面列举了一些最长用的值:

A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。

B. Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以

放大。

C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小

的允许尺寸。

D. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小

E. Expandint:控件可以自行增大或者缩小

注:sizeHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值)

摘自:
http://www.cnblogs.com/qq78292959/archive/2012/08/13/2637209.html
http://blog.youkuaiyun.com/lastsoup/article/details/7028243


Demo1。 6个button(编号1~6)水平放置。其中 1,2 之间间隔2个像素;3,4之间间隔10个像素 ;5,6之间间隔20个像素。

解决方式: 每两个放在一个QHBoxLayout中。然后三个loyout 在放到一个总的mainLayout中。

    leftLayout->addWidget(button1);
    leftLayout->addWidget(button2);
    leftLayout->setSpacing(2);
    midlayout->addWidget(button3);
    midlayout->addWidget(button4);
    midlayout->setSpacing(10);
    rightlayout->addWidget(button5);
    rightlayout->addWidget(button6);
    rightlayout->setSpacing(20);

    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(midlayout);
    mainLayout->addLayout(rightlayout);
    this->setLayout(mainLayout);

这样就可以了。其中setSpacing() 设置了布局中 控件之间的距离。
但是 如果布局之间有三个按钮(A,B,C),其中A,B间隔2像素;B,C间隔10像素,这就比较尴尬了。 其实可以使用 addSpacing(int ) 方法

    rightlayout->setSpacing(0);
    rightlayout->addWidget(buttonA);
    rightlayout->addSpacing(2);
    rightlayout->addWidget(buttonB);

    rightlayout->addSpacing(8);
    rightlayout->addWidget(buttonC);

补充:

bool QLayout::setAlignment(QWidget *w, Qt::Alignment alignment) //设置对齐方式

void QLayout::setMargin(int margin) //页边距

Demo2 如果button有MinimumSize,导致一行无法容纳下所有的buttons 例如 我们每点击一次就会加一个button,如何让添加的button自动换行。
可以使用QGridLayout 。

    layout = new QGridLayout(this);
    button = new QPushButton(this);
    layout->setHorizontalSpacing(2);
    layout->setVerticalSpacing(10);
    button->setText(QStringLiteral("新建"));
    button->move(0,0);
    QObject::connect(button,SIGNAL(clicked(bool)),this,SLOT(on_button_clicked(bool)));
void Widget::on_button_clicked(bool)
{
    QPushButton * button = new QPushButton;
    button->setText(QStringLiteral("button"));
    button->setMaximumSize(150,50);
    button->setMinimumSize(150,50);
    int row = countButton/numCol;
    int col = countButton%numCol;
    layout->addWidget(button,row,col);
    ++countButton;
}

这样每点击新建都会给loyout加一个button,可以计算位置放置。
如果依然每两个之间固定间隔,则可以结合Demo1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值