如何在切换QTreeWidgetItem内的部件时调整其尺寸?
QTreeWidgetItem切换子部件后尺寸无法自动适配问题
我自定义了一个QTreeWidget类,用于实现可折叠的部件列表。当切换某一区域内的部件(例如从短部件切换为高部件)时,QTreeWidgetItem的尺寸不会自动适配新部件的大小,但折叠该项目后重新展开,尺寸就能正确调整。
import sys from PyQt5.QtWidgets import (QToolButton, QTreeWidgetItem, QLabel, QFrame, QSizePolicy, QTreeWidget, QVBoxLayout, QApplication, QComboBox) class PanelButton(QToolButton): def __init__(self, item: QTreeWidgetItem, text): super().__init__() self.item = item self.setText(text) self.setCheckable(True) self.clicked.connect(self.on_clicked) def on_clicked(self, checked): if self.item.isExpanded(): self.item.setExpanded(False) else: self.item.setExpanded(True) class CustomTreeWidget(QTreeWidget): def __init__(self, parent=None): super().__init__(parent) self.setHeaderHidden(True) self.setIndentation(0) def add_section(self, widget, title): widget.setParent(self) button_item = QTreeWidgetItem() self.addTopLevelItem(button_item) button = PanelButton(button_item, text=title) self.setItemWidget(button_item, 0, button) body_item = QTreeWidgetItem(button_item) self.setItemWidget(body_item, 0, widget) button_item.addChild(body_item) if __name__ == "__main__": app = QApplication(sys.argv) tree_widget = CustomTreeWidget() section1 = QFrame() layout = QVBoxLayout(section1) spin_box = QComboBox() spin_box.addItems(["short", "tall"]) short_widget = QLabel("Short widget") tall_widget = QLabel("There should be more text visible under:\n\n\nmore text") layout.addWidget(spin_box) layout.addWidget(tall_widget) layout.addWidget(short_widget) size_policy = QSizePolicy() size_policy.setVerticalPolicy(QSizePolicy.Policy.Minimum) size_policy.setHorizontalPolicy(QSizePolicy.Policy.Preferred) size_policy.setVerticalStretch(0) size_policy.setHorizontalStretch(0) short_widget.setSizePolicy(size_policy) tall_widget.setSizePolicy(size_policy) short_widget.show() tall_widget.hide() def change_widget(index): short_widget.setVisible(index == 0) tall_widget.setVisible(index == 1) # None of these worked: # tree_widget.adjustSize() # tall_widget.adjustSize() # short_widget.adjustSize() # tree_widget.adjustSize() # tree_widget.updateGeometries() # tree_widget.updateGeometry() spin_box.currentIndexChanged.connect(change_widget) tree_widget.add_section(section1, "Section1") tree_widget.add_section(QLabel("Some other section"), "Section2") tree_widget.show() sys.exit(app.exec_())
已尝试但无效的解决方案:
- 为子部件设置SizePolicy
- 在部件切换后调用updateGeometry、updateGeometries、update及adjustSize方法
内容的提问来源于stack exchange,提问作者Sepand.S
相关产品推荐
相关产品推荐

