在 PySide6(或者 PyQt6)中,小部件的 sizePolicy 主要用于控制小部件在布局中的行为,特别是在调整窗口大小时。sizePolicy 由两个主要策略组成:水平策略和垂直策略。它们可以进一步细分为伸展、固定、最小、最大等类型。
术语解释: 以宽度为例
Fixed(固定):小部件的宽度是固定的,不会随父级窗口的大小调整而改变。
Minimum(最小):小部件的宽度可以增大,但不会小于其最小宽度。
Maximum(最大):小部件的宽度可以减小,但不会超过其最大宽度。
Preferred(首选):小部件的宽度会根据内容的需求调整,但也可以随父级窗口的大小调整。
Expanding(扩展):小部件会扩展以填满额外的空间,通常会与其他小部件一起填充布局。
Ignored(忽略):小部件的宽度策略被忽略,不参与布局计算。
MinimumExpanding(最小扩展):小部件将试图在布局中占据足够的空间来显示其内容,并且当布局有额外空间时,也会相应地伸展。
策略的进一步解释和优先级:
Fixed(固定):
小部件的大小是固定的,不随父窗口的大小改变。
优先级最低。
Minimum(最小):
小部件不会小于其最小尺寸,但可以扩展到更大的尺寸。
仍然可以接受布局提供的更多空间,但不会优先占用。
Maximum(最大):
小部件的大小可以扩大到最大尺寸,但不会超过这个值。
这个策略通常与 Minimum 或 Fixed 策略结合使用。
Preferred(首选):
小部件的大小根据内容要求设置一个首选大小,布局会优先考虑这个尺寸。
在没有额外空间的情况下,布局可以根据此值调整小部件的大小。
Expanding(扩展):
小部件会尽可能扩展以填满可用空间,与其他 Expanding 策略的小部件一起竞争空间。
优先级高于 Minimum 和 Preferred。
MinimumExpanding(最小扩展):
小部件至少会保持其最小大小,并有能力扩展以填充额外空间。
在需要时优先于 Minimum 和 Minimum 策略。
Ignored(忽略):
小部件的尺寸策略被忽略,不参与布局计算。
优先级最低,通常不希望使用此策略。
策略之间的关系与优先级
固定(Fixed) 小部件在尺寸方面是最不灵活的,通常不参与空间竞争。
忽略(Ignored) 策略中的小部件在布局中不做任何空间计算,但这同样不利于其大小,因此其使用应该非常谨慎。
最小(Minimum) 策略小部件最小只会按 minimumSizeHint() 的值展示并且可以扩展。
首选(Preferred) 策略给小部件一个理想的空间,但小部件仍然可以在需要时调整尺寸。
扩展(Expanding) 策略优先级更高于 Minimum 和 Preferred,它会尽量占用更多空间。
最小扩展(MinimumExpanding) 策略结合了 Minimum 和 Expanding 策略,可以保证小部件最小需求并尽量扩展。
使用 Minimun 和 Expanding 时,每个小部件的 伸展因子 决定了其在父容器中所占的空间比例。即使两者都设置为 Expanding,具有更大伸展因子的小部件将占据更多的空间。
测试用的组态画面,两个QL Abel,label1和label2,作为子部件。一个QFrame,作为父部件,将子部件拖入父部件,以下均以水平策略为例:
将QFrame ax内设置为水平布局。子部件label1的策略为Minimum,minimumSize =100,maximumSize =400,子部件label2的策略为Expanding,其余默认。
先把子部件label1拖进父部件,再温习一遍Minimum策略:
所以,显示结果如下图:
由于父部件只有label1 一个子部件,所以label1 接受了尽可能多的空间,直至maximumSize:400。如果此时将maximumSize设为默认最大值,它甚至会将父部件占满。这个似乎有些违背常理,在初学的时候曾经纠缠了我很久。因为我明明设的是Minimum策略,它为什么给设在了最大尺寸?所以一定要理解Minimum策略与minimumSize之间的关系,Minimum策略的含义是:小部件有一个尺寸的下限,当某种策略或设置使小部件的尺寸缩小时,尺寸不得小于minimumSize。换言之,实际的尺寸取决于策略的缩放趋势和相邻策略的优先级,以及伸展因子。
接着往下:把子部件label2拖进父部件:
前面说过,子部件label2的策略为Expanding ,而
所以, 子部件label2的宽的就尽可能大,直到子部件label1的尺寸减小到minimumSize,100。