QGridLayout是比QVBoxLayout和QHBoxLayout的父类,所以更为灵活。
对于提供的几个重要成员函数的作用,手册里说的也不是很明白,自己动手测试了下,算是初步了解,记录下:
1、
void addWidget ( QWidget * widget, int row, int column, Qt::Alignment alignment = 0 )
void addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0)
看源码中,两者最终都是使用由widget生成QGridBox对象,然后调用
d->add(b, fromRow, toRow, fromColumn, toColumn)
加入窗口,只不过上面的那个toRow == fromRow, toColumn==fromColumn
2、
int columnStretch ( int column ) const
void setColumnStretch ( int column, int stretch )
通过实验,我是这样理解stretch factor参数这个作用的:这个参数主要用来控制当窗口大小发生变化后,每个column新获取的空间。所以每个column都有自己的一个stretch值,会和其他行比较,然后计算出自己在窗口扩大或者缩小时获取或者丢失的空间。这里有个特殊条件,就是当初始化行大小的时候,如果并没有按照设定stretch设置各个column的大小,那么就会在缩小或者放大的时候先达到设定比列长度,然后各个行再按照设定的stretch获取新空间
测试代码:
//gridbutton.h
#include <QDialog>
class QPushButton;
class GridDialog : public QDialog
{
public:
GridDialog(QWidget *parent = 0);
private:
QPushButton *button1;
QPushButton *button2;
};
//gridbutton.cpp
#include "griddialog.h"
GridDialog :: GridDialog(QWidget *parent) : QDialog(parent)
{
button1 = new QPushButton(tr("button1"));
button2 = new QPushButton(tr("button2"));
QGridLayout *layout = new QGridLayout;
layout->setColumnMinimumWidth(0, 100);
layout->setColumnMinimumWidth(1, 10);
layout->setHorizontalSpacing(100);
layout->setVerticalSpacing(50);
layout->setColumnStretch(0, 1);
layout->setColumnStretch(1, 2);
layout->addWidget(button1, 0, 0);
layout->addWidget(button2, 1, 1, 1, 2);
setLayout(layout);
}
//main.cpp
#include <QtGui>
#include "griddialog.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
GridDialog dialog;
dialog.show();
return app.exec();
}