1、当使用布局的时候,构建子控件的时候不需要指定parent,布局将会自动的指定parent(使用QWidget::setParent()),使它们成为安装了该布局的界面的子控件。
布局中的控件是安装了该布局的界面的子控件,而非布局自身的,控件只能以控件作为parent,不能是布局。
也可以在布局中使用addLayout()来添加布局,内部的布局就会变成它的子布局。
2、若用设计器布局主窗口,生成的代码布局类对象的构造函数参数parent为ui->centralWidget(即中心工作区窗口)。
3、若用手动编写主窗口布局,则其布局类对象的构造函数参数parent需设置为this(即QMainWindow等)。布局在主窗口,如this->setLayout(m_totalHLayout);注意:手动布局主窗口不是对工作区布局。
代码参考如下:
void MainDialog::initUI()
{
m_totalHLayout = new QHBoxLayout(this);
m_totalHLayout->setSpacing(0);
m_totalHLayout->setObjectName(QString::fromUtf8("m_totalHLayout"));
m_totalHLayout->setContentsMargins(0, 0, 0, 0);
this->setLayout(m_totalHLayout);
m_leftSiderBarWidget = new LeftsiderbarWidget(ui->centralwidget);
m_leftSiderBarWidget->setObjectName(QString::fromUtf8("m_leftSiderBarWidget"));
m_leftSiderBarWidget->setGeometry(QRect(0, 0, 200, 640));
m_totalHLayout->addWidget(m_leftSiderBarWidget);
m_rightVLayout = new QVBoxLayout();
m_rightVLayout->setObjectName(QString::fromUtf8("m_rightVLayout"));
m_rightVLayout->setContentsMargins(0, 0, 0, 0);
m_titleWidget = new QWidget(ui->centralwidget);
m_titleWidget->setObjectName(QString::fromUtf8("m_titleWidget"));
m_titleWidget->setGeometry(QRect(201, 0, 760, 40));
m_rightVLayout->addWidget(m_titleWidget);
m_stackedWidget = new QStackedWidget(ui->centralwidget);
m_stackedWidget->setObjectName(QString::fromUtf8("m_stackedWidget"));
m_stackedWidget->setGeometry(QRect(201, 41, 760, 40));
m_rightVLayout->addWidget(m_stackedWidget);
m_totalHLayout->addLayout(m_rightVLayout);
initTileBar();
initLeftsideBar();
initStyleSheet();
}
当添加一个控件到一个布局中,布局过程工作如下:
1、 所有的控件将最初根据它们的 QWidget::sizePolicy()和QWidget::sizeHint()而被分配到一定空间中。
2、 如果任何一个控件有一个伸展因素设置,而且数值大于零,那么它们就会被根据它们的伸展因素的比例分配空间。
3、 如果任何一个控件有一个伸展因素设置而且数值为零,那么只有当其它控件不再需要空间的时候才会得到更多的空间。在这当中,空间会首先被根据延展大小策略分配给控件。
4、 任何控件被分配的空间的大小如果小于它们的最小大小(或者是在没有规定最小大小时的最小大小的提示),它们就会被按它们所需要的最小大小分配空间。(如果控件的伸展因素是它们的决定因素的情况下,它们不必有最小大小或者最小大小的提示。)
5、 任何控件被分配的空间的大小如果大于它们的最大大小,它们就会被按它们所需要的最大大小分配空间。(如果控件的伸展因素是它们的决定因素的情况下,它们不必有最大大小。)
当你创建自己的控件类时,也应该传递它的布局属性。如果这个控件有一个QLayout,这样的话就已经被处理了。如果这个控件不包括任何子控件,或者使用自定义布局,需要重新实现下面这些QWidget的成员函数:
只要大小提示、最小大小提示或者大小策略发生改变,都要调用QWidget::updateGeometry()。这会引起布局的重新计算。对updateGeometry()的多重调用只会引起一次重新计算。
如果你的控件的优先选用的高度依赖于它的实际宽度(比如一个自动断词的标签),在sizePolicy()中设置hasHeightForWidth()标记,并且重新实现QWidget::heightForWidth()。
即使你实现了heightForWidth(),提供一个好的sizeHint()仍然是必需的。
进一步实现,请参考:Trading Height for Width.。
如果要生成一种特殊的布局,也可以按上面的描述来生成一个自定义控件。重新实现QWidget::resizeEvent()来计算所需要分配的大小并且给每一个子控件调用setGeometry()。
当布局需要重新计算的时候,控件会得到一个类型是QEvent::LayoutRequest的事件。重新实现被通知QEvent::LayoutRequest事件的QWidget::event()。