布局管理类 介绍:
**- 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。