前言
The QSizePolicy class is a layout attribute describing horizontal and vertical resizing policy.
——Qt帮助文档
从这句话我们可以看出用QSizePolicy的场合——水平或垂直布局中。通过对QSizePolicy的设置,可影响布局引擎对控件的处理。每一个窗口部件都含有这个属性,它描述这个部件的水平和垂直的调整策略。
现在我用代码写的布局,没有实现我想要的效果,而用Qt Designer却实现了,后来比较自动生成的ui_XX.h文件,看出了区别:它使用了QSizePolicy。故在此介绍,也是学习
理论介绍
QSizePolicy包含两个调整策略(垂直和水平)和两个伸缩因子。在前言中已经提到了这个类的作用:影响布局引擎对所属窗口部件的处理。
我们再看一下类QSizePolicy的构造函数:
QSizePolicy(Policy horizontal, Policy vertical, ControlType type = DefaultType)
三个参数,前两个很明显,是调整策略,具体枚举参数见表1;第三个参数是控制类型,它同样是个枚举,它是指该部件大小策略所依赖的控制类型,一般这个参数不常用,因为在创建某个窗口部件后,它已经设置好了。
Constant | Value | Description |
---|---|---|
QSizePolicy::Fixed | 0 | QWidget::sizeHint()是唯一可接受的选择,因此部件是不能缩放的 |
QSizePolicy::Minimum | GrowFlag | QWidget::sizeHint()是最小值,并且是充分的。部件允许扩展,但是并不倾向扩展。再也没有比QWidget::sizeHint()大小再小的值了 |
QSizePolicy::Maximum | ShrinkFlag | QWidget::sizeHint()是最大值,若其他的部件需要空间,该部件是允许被缩小的,并且不会破坏该部件。 |
QSizePolicy::Preferred | GrowFlag | ShrinkFlag | QWidget::sizeHint()是最合适的值,部件可被缩小,仍可用。但是不要建议将部件扩展的比sizeHint()值大 |
QSizePolicy::Expanding | GrowFlag | ShrinkFlag | ExpandFlag | sizeHint()大小是个合理的值,但是该部件可缩小,仍可用。部件可以利用额外的空间,因此它将会得到尽可能多的空间 |
QSizePolicy::MinimumExpanding | GrowFlag | ExpandFlag | sizeHint()是最小值,并且是足够的。部件允许使用额外空间,因此它将会得到尽可能多的空间 |
QSizePolicy::Ignored | ShrinkFlag | GrowFlag | IgnoreFlag | sizeHint()将会被忽略,部件将会得到尽可能多的空间 |
通过对构造函数的介绍,大概知道这个类的用途了,下面介绍下常用的而一些函数:
(1)控件的宽对高的依赖,或高对宽的依赖。
void setHeightForWidth(bool dependent) //设置高的大小是否依赖宽的大小
void setWidthForHeight(bool dependent) //设置宽的大小是否依赖高的大小
bool hasHeightForWidth() const //查询高的大小是否依赖宽的大小
bool hasWidthForHeight() const //查询宽的大小是否依赖高的大小
(2)大小调整策略。
void setHorizontalPolicy(Policy policy) // 设置水平方向上的大小策略
void setVerticalPolicy(Policy policy) //设置垂直方向上的大小策略
Policy horizontalPolicy() const // 获取水平方向上的大小策略
Policy verticalPolicy() const //获取垂直方向上的大小策略
(3)伸缩因子。
void setHorizontalStretch(int stretchFactor) //设置水平大小策略的缩放因子,取值范围[0,255]
void setVerticalStretch(int stretchFactor) //设置垂直大小策略的缩放因子,取值范围[0,255]
int horizontalStretch() const //获取水平策略的缩放因子的大小
int verticalStretch() const //获取垂直策略的缩放因子的大小
(4)隐藏时是否预留大小。
void setRetainSizeWhenHidden(bool retainSize) //当部件被隐藏时,设置其所在布局是否应保留它的大小。如 果为true,布局将不被隐藏部件所改变
bool retainSizeWhenHidden() const //部件被隐藏时,返回布局是否应保留它的尺寸,默认为false
(5)垂直水平互换。
void QSizePolicy::transpose() //互换水平和垂直的策略和伸缩因子
代码
(1)水平策略。创建两个QLabel对象,一个水平策略设为Expanding,一个设为Minimum。当将整个界面拉伸时,可看出一个水平方向上:一个一直在变大,一个一直保持最小状态,如图一。
m_pCenterWidget=new QWidget(this);
this->setCentralWidget(m_pCenterWidget);
m_pLabel=new QLabel(this);
m_pLabel->setText(QStringLiteral("我是Label 1"));
QSizePolicy sizePolicy=m_pLabel->sizePolicy();
sizePolicy.setHorizontalPolicy(QSizePolicy::Expanding);
m_pLabel->setSizePolicy(sizePolicy);
m_pLabel2=new QLabel(this);
m_pLabel2->setText(QStringLiteral("我是Label 2"));
QSizePolicy sizePolicy2=m_pLabel->sizePolicy();
sizePolicy2.setHorizontalPolicy(QSizePolicy::Minimum);
m_pLabel2->setSizePolicy(sizePolicy2);
QHBoxLayout* pHLayout=new QHBoxLayout;
pHLayout->addWidget(m_pLabel);
pHLayout->addWidget(m_pLabel2);
m_pCenterWidget->setLayout(pHLayout);
this->setStyleSheet("QLabel{border:1px solid black};");

(2)水平伸缩因子。伸缩因子可设置两者的比例。例如Label:Label2=1:2,如图二。
m_pCenterWidget=new QWidget(this);
this->setCentralWidget(m_pCenterWidget);
m_pLabel=new QLabel(this);
m_pLabel->setText(QStringLiteral("我是Label 1"));
QSizePolicy sizePolicy=m_pLabel->sizePolicy();
sizePolicy.setHorizontalStretch(1);
m_pLabel->setSizePolicy(sizePolicy);
m_pLabel2=new QLabel(this);
m_pLabel2->setText(QStringLiteral("我是Label 2"));
QSizePolicy sizePolicy2=m_pLabel->sizePolicy();
sizePolicy2.setHorizontalStretch(2);
m_pLabel2->setSizePolicy(sizePolicy2);
QHBoxLayout* pHLayout=new QHBoxLayout;
pHLayout->addWidget(m_pLabel);
pHLayout->addWidget(m_pLabel2);
m_pCenterWidget->setLayout(pHLayout);
this->setStyleSheet("QLabel{border:1px solid black};");

结束语
感觉要学习的还有很多啊!ヾ(◍°∇°◍)ノ゙