You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在切换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:12:42