简述

QSizePolicy类是一个描述布局水平和垂直方向调整策略的属性。

大小策略会影响布局引擎处理部件的方式,部件加入布局以后,会返回一个QSizePolicy,描述了其水平和垂直方向的大小策略。可以通过QWidget::sizePolicy属性为特定部件设置大小策略。

详细描述

QSizePolicy包含了两个独立的QSizePolicy::Policy值和两个缩放因子,一个描述了部件水平方向上的大小策略,另一个描述了垂直方向上的大小策略。它还包含一个标志表明高度和宽度是否与首选大小有关。

水平和垂直方向的大小策略可以在构造函数中设置,也可以通过setHorizontalPolicy()和setVerticalPolicy()函数改变。缩放因子可以使用setHorizontalStretch()和setVerticalStretch()函数设置。setHeightForWidth()函数的标志表示部件的缺省大小(sizeHint())是否是width-dependent(例如:菜单栏或自动换行标签) 。

可以使用horizontalPolicy()、verticalPolicy()、horizontalStretch()和verticalStretch()函数来返回当前的大小策略和缩放因子。另外,使用transpose()函数可以互换水平和垂直的大小策略和缩放因子。hasHeightForWidth()函数返回了当前状态表示的大小依赖性。

为了确定相关的部件是否可以比sizeHint()函数利用更多的空间,可以使用expandingDirections()函数,通过它,还可以找出哪个方向可以展开。

最后,QSizePolicy类可以进行大小策略之间的比较,并且可以用QVariant来存储QSizePolicy。

成员类型

  • 枚举QSizePolicy::ControlType:

    指定了布局交互时不同的部件类型。

常量 描述
QSizePolicy::DefaultType 0x00000001 默认类型,当没有指定时
QSizePolicy::ButtonBox 0x00000002 一个QDialogButtonBox实例
QSizePolicy::CheckBox 0x00000004 一个QCheckBox实例
QSizePolicy::ComboBox 0x00000008 一个QComboBox实例
QSizePolicy::Frame 0x00000010 一个QFrame实例
QSizePolicy::GroupBox 0x00000020 一个QGroupBox实例
QSizePolicy::Label 0x00000040 一个QLabel实例
QSizePolicy::Line 0x00000080 一个QFrame::HLine或QFrame::VLine的QFrame实例
QSizePolicy::LineEdit 0x00000100 一个QLineEdit实例
QSizePolicy::PushButton 0x00000200 一个QPushButton实例
QSizePolicy::RadioButton 0x00000400 一个QRadioButton实例
QSizePolicy::Slider 0x00000800 一个QAbstractSlider实例
QSizePolicy::SpinBox 0x00001000 一个QAbstractSpinBox实例
QSizePolicy::TabWidget 0x00002000 一个QTabWidget实例
QSizePolicy::ToolButton 0x00004000 一个QToolButton实例
  • 枚举QSizePolicy::Policy

    当使用QSizePolicy时,描述了一系列线性维度大小策略。

常量 描述
QSizePolicy::Fixed 0 缺省大小是唯一可以接收的改变,因此部件不能放大也不能缩小。
QSizePolicy::Minimum GrowFlag 缺省大小是最小值,并且是充分的。部件允许扩展,但是并不倾向扩展(例如:水平方向上的按钮),不能比缺省大小提供的大小更小。
QSizePolicy::Maximum ShrinkFlag 缺省大小是最大值,假如其它部件需要空间并且不会破坏该部件,那么该部件允许被缩小(例如:一个分割线)。
QSizePolicy::Preferred GrowFlag | ShrinkFlag 缺省大小是最佳效果,部件允许放大或缩小,但不倾向于扩展比sizeHint()大(QWidget的缺省策略)。
QSizePolicy::Expanding GrowFlag | ShrinkFlag | ExpandFlag 缺省大小是合理的大小,但部件允许缩小并且可用。部件可以利用额外的空间,因此它将会得到尽可能多的空间(例如:水平方向上的滑块)。
QSizePolicy::MinimumExpanding GrowFlag | ExpandFlag 缺省大小是最小值,并且是足够的。部件允许使用额外空间,因此它将会得到尽可能多的空间(例如:水平方向上的滑块)。
QSizePolicy::Ignored ShrinkFlag | GrowFlag | IgnoreFlag 缺省大小将会被忽略,部件将会得到尽可能多的空间。
  • 枚举QSizePolicy::PolicyFlag

    这些标志被组合在一起,以形成一系列大小策略值。

常量 描述
QSizePolicy::GrowFlag 1 部件可以在必要时增长至超过它的尺寸。
QSizePolicy::ExpandFlag 2 部件应该得到尽可能多的空间。
QSizePolicy::ShrinkFlag 4 部件可以在必要时缩小至小于它的尺寸。
QSizePolicy::IgnoreFlag 8 部件的缺省大小被忽略,它将会得到尽可能多的空间。

公共函数

  • ControlType QSizePolicy::controlType() const

    返回部件大小策略所依赖的控制类型

  • Qt::Orientations QSizePolicy::expandingDirections() const

    返回一个部件是否可以比QWidget::sizeHint()使用更多的空间

    Qt::Horizontal 或 Qt::Vertical意味着可以在水平或垂直方向上伸展(例如:水平或垂直策略是Expanding或MinimumExpanding),然而Qt::Horizontal | Qt::Vertical意味着可以在两个方向上均可以伸展。

  • bool QSizePolicy::hasHeightForWidth() const

    如果部件的首选高度依赖于它的宽度,则返回true;否则,返回false。

  • bool QSizePolicy::hasWidthForHeight() const

    如果部件的宽度取决于其高度,则返回true;否则返回false。

  • Policy QSizePolicy::horizontalPolicy() const

    返回水平方向上的大小策略

  • int QSizePolicy::horizontalStretch() const

    返回水平方向上大小策略的缩放因子

  • bool QSizePolicy::retainSizeWhenHidden() const

    部件被隐藏时,返回布局是否应保留它的尺寸,默认为false。

  • void QSizePolicy::setControlType(ControlType type)

    设置部件大小策略所依赖的控制类型

  • void QSizePolicy::setHeightForWidth(bool dependent)

    设置标志判断窗口部件的首选高度是否依赖于它的宽度。

  • void QSizePolicy::setHorizontalPolicy(Policy policy)

    设置水平方向上的大小策略

  • void QSizePolicy::setHorizontalStretch(int stretchFactor)

    设置水平大小策略的缩放因子,取值范围[0,255]。

    当两个部件在一个水平布局中彼此相邻,如果左侧的缩放因子设置为2,右侧的缩放因子设置为1,那么,左侧部件大小将总是右边的两倍。

  • void QSizePolicy::setRetainSizeWhenHidden(bool retainSize)

    当部件被隐藏时,设置其所在布局是否应保留它的大小。如果为true,布局将不被隐藏部件所改变。

  • void QSizePolicy::setVerticalPolicy(Policy policy)

    设置垂直方向上的大小策略

  • void QSizePolicy::setVerticalStretch(int stretchFactor)

    设置垂直大小策略的缩放因子,取值范围[0,255]。

  • void QSizePolicy::setWidthForHeight(bool dependent)

    设置标志确定部件的宽度是否依赖于它的高度。

    仅支持QGraphicsLayout的子类,不可能有布局同时存在height-for-width和width-for-height。

  • void QSizePolicy::transpose()

    互换水平和垂直策略和伸展。

  • Policy QSizePolicy::verticalPolicy() const

    返回垂直方向上的大小策略

  • int QSizePolicy::verticalStretch() const

    返回垂直方向上大小策略的缩放因子

示例

控制类型

下面,构建一个QLabel及QTableWidget对象,获取它们的控制类型:

QLabel *pLabel = new QLabel(this);
QTableWidget *pTableWidget = new QTableWidget(this); // 获取大小策略
QSizePolicy labelSizePolicy = pLabel->sizePolicy();
QSizePolicy tableSizePolicy = pTableWidget->sizePolicy(); // 获取控制类型
QSizePolicy::ControlType labelType = labelSizePolicy.controlType(); //QSizePolicy::Label
QSizePolicy::ControlType tableType = tableSizePolicy.controlType(); //QSizePolicy::DefaultType

参照枚举QSizePolicy::ControlType对应的常量表,我们很容易发现:QLabel所对应的控制类型为QSizePolicy::Label,而QTableWidget所对应的控制类型为QSizePolicy::DefaultType。

QSizePolicy

为了测试大小策略及缩放因子,我们来构建一个Windows中最常见的资源管理器:

默认效果

效果

源码

QTreeWidget *pTreeWidget = new QTreeWidget(this);
QTableWidget *pTableWidget = new QTableWidget(this); ... QHBoxLayout *pLayout = new QHBoxLayout();
pLayout->addWidget(pTreeWidget);
pLayout->addWidget(pTableWidget);
pLayout->setSpacing(10);
pLayout->setContentsMargins(10, 10, 10, 10); setLayout(pLayout); // 获取大小策略
QSizePolicy treeSizePolicy = pTreeWidget->sizePolicy();
QSizePolicy tableSizePolicy = pTableWidget->sizePolicy();

将QTreeWidget和QTableWidget加入布局后,分别获取它们的大小策略,可以很容易的发现水平和垂直方向的值均为7。

7代表什么?

由于QSizePolicy::Policy由QSizePolicy::PolicyFlag组合而成,所以可以很轻易地发现对应的值是:QSizePolicy::Expanding,递推分析:7 = (1 | 2 | 4) = (QSizePolicy::GrowFlag | QSizePolicy::ExpandFlag | QSizePolicy::ShrinkFlag) = QSizePolicy::Expanding。

可以看出,它们同时缩小、同时放大,并且等比均匀划分。

大小策略控制

当界面缩小时,我们尽可能的让左边的QTreeWidget缩小;而界面放大时,尽可能的让右边的TableView放大,且QTreeWidget达到缺省宽度时就不会被放大。

效果

源码

通过使用QSizePolicy::Maximum来控制,具体说明,请参考枚举QSizePolicy::Policy。

QTreeWidget *pTreeWidget = new QTreeWidget(this);
QTableWidget *pTableWidget = new QTableWidget(this); ... QHBoxLayout *pLayout = new QHBoxLayout();
pLayout->addWidget(pTreeWidget);
pLayout->addWidget(pTableWidget);
pLayout->setSpacing(10);
pLayout->setContentsMargins(10, 10, 10, 10); setLayout(pLayout); // 获取大小策略
QSizePolicy treeSizePolicy = pTreeWidget->sizePolicy();
QSizePolicy tableSizePolicy = pTableWidget->sizePolicy(); treeSizePolicy.setHorizontalPolicy(QSizePolicy::Maximum);
pTreeWidget->setSizePolicy(treeSizePolicy);
tableSizePolicy.setHorizontalPolicy(QSizePolicy::Expanding);
pTableWidget->setSizePolicy(tableSizePolicy);

缩放因子控制

当界面缩放时,为了保持一定的比例,右边的QTableWidget永远是左边QTreeWidget的2倍,我们可以通过setHorizontalStretch()来设置缩放因子。

效果

源码

QTreeWidget *pTreeWidget = new QTreeWidget(this);
QTableWidget *pTableWidget = new QTableWidget(this); ... QHBoxLayout *pLayout = new QHBoxLayout();
pLayout->addWidget(pTreeWidget);
pLayout->addWidget(pTableWidget);
pLayout->setSpacing(10);
pLayout->setContentsMargins(10, 10, 10, 10); setLayout(pLayout); // 获取大小策略
QSizePolicy treeSizePolicy = pTreeWidget->sizePolicy();
QSizePolicy tableSizePolicy = pTableWidget->sizePolicy(); treeSizePolicy.setHorizontalStretch(1);
tableSizePolicy.setHorizontalStretch(2);
pTreeWidget->setSizePolicy(treeSizePolicy);
pTableWidget->setSizePolicy(tableSizePolicy);

这样,就可以很很好地根据大小策略及缩放因子来控制界面效果了。你也可以进行任意组合,不妨试试。

Qt之QSizePolicy的更多相关文章

  1. 《Qt 实战一二三》

    简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...

  2. Qt4与Qt3的主要不同

    Qt4与Qt3的主要不同 1)QT4 中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的 工作是巨大的,这 ...

  3. Qt 的几个核心机制总结之 布局(QWidget可以设置setSizePolicy,而QSizePolicy有Fixed,minimum,maximum,preferred,expanding,ignore等7个属性,还可以横竖分开)

    1.Qt布局的作用 Qt的布局是通过布局管理器来实现的,布局管理器负责在父类窗口部件区域构建子窗口部件,使得放置在窗体中的每个窗口部件都有一个适合的大小和位置,并且能够随着应用程序本身的变化而变化从而 ...

  4. Qt之QSpacerItem(控件之间的间距不尽相同,可以借助QSpacerItem来设置,并且还可以对QSpacerItem设置QSizePolicy)

    http://blog.csdn.net/u011012932/article/details/51614868

  5. Qt And MFC UI Layout

    界面布局 起初,计算机的交互是通过输入的代码进行的, 慢慢的有了图形之后, 就开始了图形界面的交互. 目前来说还有语音交互, 视频交互等多媒体的交互. 不管哪一种交互, 最终在计算机的角度都是信号的输 ...

  6. Qt之布局管理--基本布局

    Qt提供的布局类以及他们之间的继承关系QLayout-----QGirdLayout | ---QBoxLayout----QHBoxLayout | --QVBoxLayout----------- ...

  7. QT常规控件操作备忘

    QLabel设置边框和颜色: label->setFrameShape (QFrame::Box); label->setStyleSheet("border: 1px soli ...

  8. 用Qt写软件系列五:一个安全防护软件的制作(3)

    引言 上一篇中讲述了工具箱的添加.通过一个水平布局管理器,我们将一系列的工具按钮组合到了一起,完成了工具箱的编写.本文在前面的基础上实现窗体分割效果.堆栈式窗口以及Tab选项卡. 窗体分割 窗体分割是 ...

  9. 用Qt写软件系列五:一个安全防护软件的制作(2)

    引言 在上一篇中讲述了主窗体的创建和设计.主窗体的无边框效果.阴影效果.拖动事件处理.窗体美化等工作在前面的博客中早就涉及,因此上篇博文中并未花费过多笔墨.这一篇继续讲述工具箱(Tool Button ...

随机推荐

  1. Create Stacked Canvas to Scroll Horizontal Tabular Data Blocks In Oracle Forms

    In this tutorial you will learn to create horizontal scrollable tabular or detail data block by usin ...

  2. django-crontab定时任务

    django-crontab实现定时任务 1 django-crontab安装 django-crontab安装: django-crontab加入:只需要将INSTALLED_APPS即可.如下代码 ...

  3. [HDOJ5289]Assignment(RMQ,二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:求满足区间内最大值和最小值差为k的区间个数. 预处理出区间的最值,枚举左端点,根据最值的单 ...

  4. 08.安装Oracle 10g和SQLServer2008(仅作学习使用VirtualBox虚拟机来安装节省电脑资源)

    1.虚拟机和宿主机共享文件夹. 2.右ctrl+F切换VirtualBox全屏 3.安装Oracle 10g 4.输入密码:root------------>下一步 5.勾选网络配置" ...

  5. [C程序设计语言]第五部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. CA*Layer(CAShapeLayer--CATextLayer)

    CAShapeLayer CAShapeLayer是一个通过矢量图形而不是bitmap来绘制的图层子类.你指定诸如颜色和线宽等属性,用CGPath来定义想要绘制的图 形,最后CAShapeLayer就 ...

  7. Java——FIle:

    1.读取文件夹中的文件 /** * 读取图片文件 * @param imgPath 文件所在的文件夹绝对路径 * @return * @throws FileNotFoundException */ ...

  8. day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号

    python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q  (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...

  9. iOS - OC Enum 枚举

    前言 iOS 5.0 之后,提供了新的枚举定义方式,定义枚举的同时,可以指定枚举中数据的类型. typedef NS_OPTIONS(_type, _name) new; -> 位移的,可以使用 ...

  10. VB6.0

    1. 安装包来自 http://msdn.itellyou.cn/ 下载的文件为: sc_vb6_ent_cd1.iso sc_vb6_ent_cd2.iso 2.安装时,"请输入产品的 I ...