刚学qt,对它的gridlayout功能非常欣赏 -- 不用自己去考虑如何安放控件了,layout自动把它们放好。但是今天发现自己对layout的功能并没完全吃透。以前一直认为控件放到layout里面,只要动用了setColumnStretch和setRowStretch函数,控件的尺寸就被按比例缩放了。其实不然。看下面的代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QBrush>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QBrush brh(Qt::blue);
mp_gLayout = new QGridLayout;
mp_gLayout->setColumnStretch(0,1);
mp_gLayout->setColumnStretch(1,1);
mp_gLayout->setColumnStretch(2,1);
mp_gLayout->setColumnStretch(3,1);
mp_gLayout->setColumnStretch(4,1);
mp_gLayout->setColumnStretch(5,1);
mp_gLayout->setColumnStretch(6,1);
mp_gLayout->setColumnStretch(7,1);
mp_gLayout->setColumnStretch(8,1);
mp_gLayout->setColumnStretch(9,1);
mp_gLayout->setRowStretch(0,1);
mp_gLayout->setRowStretch(1,1);
mp_gLayout->setRowStretch(2,1);
mp_gLayout->setRowStretch(3,1);
mp_gLayout->setRowStretch(4,1);
mp_gLayout->setRowStretch(5,1);
mp_gLayout->setRowStretch(6,1);
mp_gLayout->setRowStretch(7,1);
mp_gLayout->setRowStretch(8,1);
mp_gLayout->setRowStretch(9,1);
mp_View = new QGraphicsView;
mp_View->setBackgroundBrush(brh);
mp_Scene = new QGraphicsScene;
mp_Rect = new QGraphicsRectItem;
mp_Scene->addItem(mp_Rect);
mp_View->setScene(mp_Scene);
<span style="color:#ff0000;">mp_gLayout->addWidget(mp_View, 3,3,4,4);
qDebug("width = %d, viewWidth = %d", width(), mp_View->width());</span>
ui->centralWidget->setLayout(mp_gLayout);
mp_Rect->setRect(0,0,mp_View->width()/5,mp_View->height()/5);
mp_View->show();
}
MainWindow::~MainWindow()
{
delete mp_Rect;
delete mp_Scene;
delete mp_View;
delete mp_gLayout;
delete ui;
}
注意红色部分。第一句红语句已经把mp_View的尺寸变成了layout长宽的各 4/10。在下图里面也可以看到,蓝色区域确实是整个layout的40%。但是,图的最下方输出的debug信息表明:mp_View的宽度是640,甚至还大于layout的400!这说明,layout并没有改变mp_View的实际大小。