QSizePolicy的使用--Qt

前言

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};");
图二

 

结束语

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值