如何获取QBoxLayout中QSpacerItem的拉伸因子?
问题:从QBoxLayout的QSpacerItem中获取拉伸因子
向QBoxLayout调用addStretch()或insertStretch()方法时,会向布局中添加/插入QSpacerItem,且可设置拉伸因子。但尝试通过item.sizePolicy().verticalStretch()获取该因子时始终返回0,示例代码如下:
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QSpacerItem class Window(QWidget): def __init__(self): super().__init__() self.setGeometry(700, 500, 100, 200) self.layout = QVBoxLayout(self) for i in range(3): but = QPushButton(f'Push {i}') self.layout.addWidget(but) if i == 0: but.clicked.connect(self.click) self.layout.insertStretch(1, 2) self.layout.insertStretch(3, 3) def click(self): for i in (1, 3): stretch = self.layout.itemAt(i) assert isinstance(stretch, QSpacerItem) pol = stretch.sizePolicy() print(pol.verticalStretch()) app = QApplication([]) window = Window() window.show() app.exec()
请问拉伸因子存储在哪里?是否可以直接获取该信息,还是必须单独保存拉伸信息的引用?
解答
核心原因
addStretch()/insertStretch()设置的拉伸因子是QBoxLayout层面的空间分配权重,并非QSpacerItem自身的属性。QSpacerItem的sizePolicy().verticalStretch()对应的是控件自身的拉伸策略,和布局层面的空间分配因子完全是两个概念,因此会返回0。
可行解决方案
方案1:通过QBoxLayout的stretch()方法直接获取
QBoxLayout提供了stretch(int index)方法,可直接返回布局中第index个项的拉伸因子,不管该项是控件还是QSpacerItem。修改示例中的click方法即可验证:
def click(self): for i in (1, 3): print(self.layout.stretch(i)) # 输出2和3
方案2:自行记录拉伸因子
在添加/插入拉伸项时,手动记录每个项的位置和对应拉伸因子,比如用字典存储:
class Window(QWidget): def __init__(self): super().__init__() self.setGeometry(700, 500, 100, 200) self.layout = QVBoxLayout(self) self.stretch_records = {} # 存储位置:拉伸因子的映射 for i in range(3): but = QPushButton(f'Push {i}') self.layout.addWidget(but) if i == 0: but.clicked.connect(self.click) # 插入时记录拉伸因子 self.layout.insertStretch(1, 2) self.stretch_records[1] = 2 self.layout.insertStretch(3, 3) self.stretch_records[3] = 3 def click(self): for i in (1, 3): print(self.stretch_records[i]) # 输出2和3
结论
无法直接从QSpacerItem对象获取布局层面的拉伸因子,因为Qt未将该属性暴露给QSpacerItem的API。推荐使用QBoxLayout的stretch()方法,或者自行记录拉伸信息的引用。
内容的提问来源于stack exchange,提问作者mahkitah
相关产品推荐
相关产品推荐

