QSizePolicy

来源:互联网 发布:上海数据交易中心官网 编辑:程序博客网 时间:2024/05/13 12:30

Qt之QSizePolicy

标签: QtQSizePolicQt大小策略Qt缩放因子Qt布局管理
4808人阅读 评论(2)收藏举报
本文章已收录于:
分类:
作者同类文章X

    目录(?)[+]

    1. 简述
    2. 详细描述
    3. 成员类型
    4. 公共函数
    5. 示例
      1. 控制类型
      2. QSizePolicy
      3. 默认效果
        1. 效果
        2. 源码
      4. 大小策略控制
        1. 效果
        2. 源码
      5. 缩放因子控制
        1. 效果
        2. 源码

    简述

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

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

    • 简述
    • 详细描述
    • 成员类型
    • 公共函数
    • 示例
      • 控制类型
      • QSizePolicy
      • 默认效果
        • 效果
        • 源码
      • 大小策略控制
        • 效果
        • 源码
      • 缩放因子控制
        • 效果
        • 源码

    详细描述

    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::DefaultType0x00000001默认类型,当没有指定时QSizePolicy::ButtonBox0x00000002一个QDialogButtonBox实例QSizePolicy::CheckBox0x00000004一个QCheckBox实例QSizePolicy::ComboBox0x00000008一个QComboBox实例QSizePolicy::Frame0x00000010一个QFrame实例QSizePolicy::GroupBox0x00000020一个QGroupBox实例QSizePolicy::Label0x00000040一个QLabel实例QSizePolicy::Line0x00000080一个QFrame::HLine或QFrame::VLine的QFrame实例QSizePolicy::LineEdit0x00000100一个QLineEdit实例QSizePolicy::PushButton0x00000200一个QPushButton实例QSizePolicy::RadioButton0x00000400一个QRadioButton实例QSizePolicy::Slider0x00000800一个QAbstractSlider实例QSizePolicy::SpinBox0x00001000一个QAbstractSpinBox实例QSizePolicy::TabWidget0x00002000一个QTabWidget实例QSizePolicy::ToolButton0x00004000一个QToolButton实例


    • 枚举QSizePolicy::Policy

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

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


    • 枚举QSizePolicy::PolicyFlag

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

    常量值描述QSizePolicy::GrowFlag1部件可以在必要时增长至超过它的尺寸。QSizePolicy::ExpandFlag2部件应该得到尽可能多的空间。QSizePolicy::ShrinkFlag4部件可以在必要时缩小至小于它的尺寸。QSizePolicy::IgnoreFlag8部件的缺省大小被忽略,它将会得到尽可能多的空间。

    公共函数

    • 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::LabelQSizePolicy::ControlType tableType = tableSizePolicy.controlType();  //QSizePolicy::DefaultType
    • 1

    参照枚举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();
    • 1

    将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);
    • 1

    缩放因子控制

    当界面缩放时,为了保持一定的比例,右边的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);
    • 1

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

    0 0
    原创粉丝点击