Qt系列-5、控件的大小策略

本文详细介绍了Qt中的布局管理概念,包括合适的大小、最小合适大小、大小策略、伸缩因子、大小约束、空白和间距等内容。解释了这些概念如何影响窗口部件的布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1 合适的大小

sizeHint : const QSize

This property holds the recommended size for the widget.

If the value of this property is an invalid size, no size is recommended.

The default implementation of sizeHint() returns an invalid size if there is no layout for this widget, and returns the layout's preferred size otherwise.

Access functions:

virtual QSize sizeHint () const


翻译:

这个属性为部件提供了大小,如果这个属性的值是无效的,那么没有大小可被提供,如果这个部件没有layout布局那么默认的sizeHint()的实现将返回无效的值,相反sizeHint()则返回一个layout理想的大小。

这就说明,我们使用sizeHint()时要使用在layout布局中,如果没有布局则会失效。

◆  如果该窗口部件不属于任何布局管理器,那么该函数将返回一个无效的值;

 

2 最小合适大小

minimumSizeHint : const QSize

This property holds the recommended minimum size for the widget.

If the value of this property is an invalid size, no minimum size is recommended.

The default implementation of minimumSizeHint() returns an invalid size if there is no layout for this widget, and returns the layout's minimum size otherwise. Most built-in widgets reimplement minimumSizeHint().

QLayout will never resize a widget to a size smaller than the minimum size hint unless minimumSize() is set or the size policy is set to QSizePolicy::Ignore. If minimumSize() is set, the minimum size hint will be ignored.

Access functions:

virtual QSize minimumSizeHint () const

翻译: 这个属性为部件提供了最小大小。如果这个属性是一个无效的值,那么没有最小大小可提供,如果这个部件没有布局那么默认minimumSizeHint()将返回一个无效的值,相反将返回一个布局的最小合适的大小值。

最小大小提示(minimum size hint)是Qt为窗口部件推荐的最小尺寸,它的使用规则是:

如果需要绘制的窗口部件的尺寸(包括长和高两个方面)小于其最小提示(这在Qt Designer中往往表现为有些被压缩的看不到它的内容),并且该窗口部件的最小提示在最大尺寸和最小尺寸允许的范围内,那么该窗口部件显示的尺寸将是其最小提示的值。

设置窗口部件的最小大小提示是通过QWidget::minimumSizeHint()完成的。它的返回值有如下情景:

◆  如果该窗口部件没有布局管理器,该函数返回一个无效的值;

◆  如果该窗口部件属于某个布局管理器,该函数返回布局管理器认为合适的一个尺寸。

 

3.大小策略(size policy)

    一个窗口部件的大小策略会告诉布局系统应该如何对它进行拉伸或收缩。Qt为它所有的内置窗口部件都提供了合理的默认大小策略值,但是由于不可能为每一种可能产生的布局都提供唯一的默认值,所以在一个窗体中,开发人员改变它上面的一个或两个窗口部件的大小策略是非常普遍的现象。一个QSizePolicy既包含一个水平分量也包含一个垂直分量。以下是一些常用的取值:

表11-1 枚举值QSizePolicy::Policy的内容

枚举常量

说明

QSizePolicy::Fixed

0

大小提示是该窗口部件的唯一尺寸选择,所以它不会发生任何的伸缩。

QSizePolicy::Minimum

GrowFlag

大小提示是该窗口部件的最小尺寸,它不会变得更小,但它可以变得更大,不过采用该策略的窗口部件在“争夺”空间上不占优势。

QSizePolicy::Maximum

ShrinkFlag

大小提示是该窗口部件的最大尺寸,也就是该窗口部件不会比大小提示的尺寸更大。该窗口部件可以在没有受到其它窗口部件“要求”的情况下,自由的缩小尺寸。

QSizePolicy::Preferred

GrowFlag | ShrinkFlag

一般情况下,该窗口部件会将大小提示作为它的优先和最佳选择,但它也可以变得足够的小,也可以变大,但不占优势。该策略是QWidget窗口部件默认的策略。

QSizePolicy::Expanding

GrowFlag | ShrinkFlag | ExpandFlag

采用该策略的窗口部件也能够感觉到尺寸提示,但是它倾向于尽可能的占用更大的空间,该窗口部件也可以变得足够小。

QSizePolicy::MinimumExpanding

GrowFlag | ExpandFlag

大小提示将是该窗口部件的最小尺寸,该窗口部件将尽可能的占用更多的空间。该策略已经不再被推荐使用,建议用Expanding替代它,并且重载minimumSizeHint()。

QSizePolicy::Ignored

ShrinkFlag | GrowFlag | IgnoreFlag

与Expanding有些相似,只是所有的大小提示都被忽略,该窗口部件将会尽可能的占用空间。

 

表11-1中的“值”这一列实际上告诉了我们每一种策略一般是具有“倾向性”的,比如QSizePolicy::Fixed的值为0,则它“倾向于”保持自己的大小不变,即保持大小提示的尺寸。而QSizePolicy::Expanding的值是3个值的叠加,总的“倾向性”是趋于占用更多空间的,等等。这就为当多个具有不同大小策略的窗口部件放置在一起时,如何判断它们占用空间的模式提供了基本的判断依据,以下是几种常见的组合。

◆ 相同大小策略的窗口部件被布局管理器组合在一起。在这种情况下,除了窗口部件不能超出它的大小范围外,不同的窗口部件可以按自己的伸缩因子在其允许的范围内自由的伸缩。

◆ QSizePolicy::Fixed和任何其他的大小策略组合在一起。

具有QSizePolicy::Fixed大小策略的窗口部件其大小是不变的,即保持在sizeHint()大小,而其他的窗口部件可以在允许的范围内自由伸缩。

◆ QSizePolicy::Preferred和QSizePolicy::Expanding组合在一起。

具有QSizePolicy::Preferred尺寸策略的窗口部件其大小是不变的,即它认为大小提示是最适合它的,而其他的窗口部件大小可以在其允许的范围内自由伸缩。

◆ QSizePolicy::Ignored和其他尺寸策略(QSizePolicy::Fixed策略除外)组合在一起的时候,不同的窗口部件在各自允许的范围内自由伸缩。

◆ QSizePolicy::Preferred,QSizePolicy::Minimum和QSizePolicy::Maximum组合在一起的时候,各窗口部件在各自允许的范围内可以自由伸缩。

4.伸缩因子(stretch factor)

    除了大小策略中包含的水平方向和垂直方向两个分量之外,QSizePolicy类还保存了水平方向和垂直方向的一个伸缩因子。这些伸缩因子可以用来说明在增大窗体时,对不同的子窗口部件应使用的不同放大比例。即需要设置QSizePolicy::horizontalStretch和QSizePolicy::verticalStretch的值来实现。默认情况下,被布局管理器组合在一起的窗口部件的伸缩因子是相等的,都为0。此时,在所有的窗口部件都没有超出各自的大小范围允许的情况下,窗口部件的大小始终相等。

例如,假定在一个QListWidget的右面还有一个QTextEdit,并且希望这个QTextEdit的长度能够是QListWidget长度的两倍,那么就可以把这个QTextEdit在水平方向上的拉伸因子(QSizePolicy::horizontalStretch)设置为2,而把QListWidget在水平方向上的拉伸因子(QSizePolicy::horizontalStretch)设置为1;垂直方向上保持默认为0,即两者一样的高。 

5.大小约束(size constraint

影响布局方式的另一种方法是设置它的子窗口部件的最大大小、最小大小或固定大小。这些是通过设置sizeConstraint属性来完成的。该属性值是一个枚举常量,定义了布局的大小约束的模式。表列出了它所有可能的取值,它的默认值是QLayout::SetDefaultConstraint。获取和设置该属性值可以通过QWidget::layout()来获取主窗口部件的布局管理器,然后可以调用QLayout::sizeConstraint()函数来查看当前的设置情况,然后再通过QLayout::setSizeConstraint()函数来设置该布局管理器的sizeConstraint属性。这两种函数的原型如下:

     SizeConstraint sizeConstraint () const
     void setSizeConstraint ( SizeConstraint )

其中,SizeConstraint的取值即是在表11-2中的枚举值的范围内。

表11-2 布局管理器的大小约束属性(QLayout::SizeConstraint)可能的取值

常量

说明

QLayout::SetDefaultConstraint

0

主窗口部件的最小尺寸设置为minimumSize(),除非该窗口部件已经有一个最小尺寸

QLayout::SetFixedSize

3

主窗口部件的尺寸设置为sizeHint(),并且不允许改变该窗口部件的尺寸

QLayout::SetMinimumSize

2

主窗口部件的最小尺寸设置为minimumSize(),并且该窗口部件不能够变得更小

QLayout::SetMaximumSize

4

主窗口部件的最大尺寸设置为maximumSize(),并且该窗口部件不能够变得更大

QLayout::SetMinAndMaxSize

5

主窗口部件的最小尺寸设置为minimumSize(),最大尺寸设置为maximumSize()

QLayout::SetNoConstraint

1

主窗口部件的大小不会受到约束

6.空白(margin)和间距(spacing)

每种布局都有两个重要的属性,空白和间距。空白指的是整个布局四周距离窗体边缘的距离;间距指的是布局管理器内部各个窗口部件之间的距离。

空白属性即margin(),间距属性即spacing(),它们的默认值是有窗体的风格决定的。Qt的默认风格下,子窗体部件的margin()的值是9英寸,窗体的margin()值是11英寸。spacing()的值与margin()相同。

如果要设置这两个值可以通过setMargin()和setSpacing()。

注意,从Qt4.3开始,margin()属性已经逐渐不再被Qt4所推荐,更好的设置空白的方法是使用setContentsMargins()方法,它的原型如下:

     void QLayout::setContentsMargins ( int left, int top, int right, int bottom )

其中,lefttopright, 和 bottom表示环绕在布局周围的空白。

对于QGridLayout 和QFormLayout,不要使用setSpacing()方法,而是要分别使用setHorizontalSpacing()setVerticalSpacing()方法来设置水平和垂直方向的间距。如果你使用了setSpacing()方法,获取spacing()时,它的返回值将为-1。

<think>我们正在讨论Qt中如何让控件根据窗口大小自适应。根据引用内容,关键点在于使用布局管理器和设置控件的sizePolicy。步骤如下:1.使用布局管理器:在窗体上放置控件后,通过布局管理器(如水平布局、垂直布局、栅格布局等)来管理控件的位置和大小。2.设置控件的sizePolicy:每个控件都有一个大小策略(sizePolicy),它决定了控件在布局中如何随着窗口的变化而调整。具体操作(以QtDesigner为例):-首先,将控件放入窗体。-然后,为控件控件组设置布局(例如,选中几个控件,右键选择“水平布局”或“垂直布局”)。-最后,为顶层窗口设置布局(在空白处右键,选择“布局”->“栅格布局”等),这样当窗口大小改变时,布局内的控件就会自动调整。另外,可以通过代码设置控件的sizePolicy,例如:QSizePolicypolicy=widget->sizePolicy();policy.setHorizontalPolicy(QSizePolicy::Expanding);//水平方向扩展policy.setVerticalPolicy(QSizePolicy::Expanding);//垂直方向扩展widget->setSizePolicy(policy);引用中提到的sizeHint是控件建议的大小,布局管理器会参考这个值。注意:使用布局管理器后,当窗口缩放时,布局内的控件会按照布局规则和大小策略自动调整。下面是一个简单的示例代码,展示如何通过代码设置布局和大小策略:</think>### Qt控件自适应窗口大小布局管理 在Qt中实现控件自适应窗口大小主要通过**布局管理器**和**大小策略(sizePolicy)** 来实现。以下是详细步骤: #### 核心方法 1. **布局管理器应用** - 在窗体空白处右键 → 选择「布局」 - 常用布局类型: - **栅格布局(Grid Layout)**:最常用的自适应布局 - **水平布局(Horizontal Layout)** - **垂直布局(Vertical Layout)** - 嵌套布局示例: ```cpp // 创建主布局和子布局 QVBoxLayout *mainLayout = new QVBoxLayout; QHBoxLayout *subLayout = new QHBoxLayout; // 添加控件到子布局 subLayout->addWidget(btn1); subLayout->addWidget(btn2); // 将子布局加入主布局 mainLayout->addLayout(subLayout); setLayout(mainLayout); // 应用主布局到窗口 ``` 2. **大小策略(sizePolicy)配置** - 控件的自适应行为由`QSizePolicy`控制: ```cpp // 设置按钮的扩展策略 QPushButton *button = new QPushButton("Submit"); button->setSizePolicy( QSizePolicy::Expanding, // 水平策略 QSizePolicy::Fixed // 垂直策略 ); ``` - 常用策略值: | 策略 | 效果 | |---|---| | `Fixed` | 固定大小 | | `Minimum` | 不小于sizeHint() | | `Expanding` | 尽可能扩展 | | `Preferred` | 首选sizeHint()但可扩展 | 3. **弹簧元件(Spacer)使用** - 在布局中添加空白伸缩区域: ```cpp // 添加水平弹簧 QSpacerItem *spacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); layout->addItem(spacer); // 添加到布局末尾 ``` #### 设计器操作步骤 1. 在Qt Designer中选中控件 → 右键 → 选择布局类型 2. 在空白区域右键 → 选择「布局」→ 应用栅格布局 3. 设置控件策略- 选中控件 → 属性编辑器 → 修改`sizePolicy` - 水平/垂直策略设为`Expanding`实现完全自适应 #### 关键原则 1. 顶级窗口必须设置布局管理器 2. 嵌套布局时,最外层使用栅格布局效果最佳 3. `sizeHint()`提供控件的理想初始尺寸 4. 使用`setMinimumSize()`/`setMaximumSize()`约束缩放范围 > 当窗口缩放时,布局管理器会自动计算每个控件的位置和大小,根据sizePolicy决定拉伸比例[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值