调整 QTreeWidget 内的小部件大小(使用 setItemWidget 设置)?

Posted

技术标签:

【中文标题】调整 QTreeWidget 内的小部件大小(使用 setItemWidget 设置)?【英文标题】:Resize widget inside QTreeWidget (set with setItemWidget)? 【发布时间】:2021-07-16 06:54:51 【问题描述】:

我在QTreeWidget 中有一个QListWidget,我希望它在添加或删除行时自动调整其高度。我让QListWidget 自动调整大小工作,但是当它在QTreeWidget 内时它会中断,QListWidget 的大小会增加,但QTreeWidget 没有正确调整它并且其他行被覆盖。

from PyQt5 import QtCore, QtGui, QtWidgets, sip
from PyQt5.QtCore import Qt


class MyListWidget(QtWidgets.QListWidget):
    def sizeHint(self):
        width = super().sizeHint().width()
        height = sum([self.sizeHintForRow(i) for i in range(self.count())]) + 5
        return QtCore.QSize(width, height)


app = QtWidgets.QApplication([])

tree = QtWidgets.QTreeWidget()

item1 = QtWidgets.QTreeWidgetItem(tree, ['item1'])
item2 = QtWidgets.QTreeWidgetItem(tree, ['item2'])
item3 = QtWidgets.QTreeWidgetItem(tree, ['item3'])

list_widget = MyListWidget()
list_widget.addItems(list('abcd'))

tree.setItemWidget(item1, 0, list_widget)

button = QtWidgets.QPushButton("Add row")
button.clicked.connect(lambda: [list_widget.addItem("New row"),
                                list_widget.adjustSize(),
                                tree.adjustSize(),
                                tree.updateGeometry()
                                ])

container = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout()
container.setLayout(layout)

layout.addWidget(tree)
layout.addWidget(button)

container.show()
list_widget.show()
app.exec_()

初始输出:

点击新增后的输出:

正如您在第二张图片中看到的,item2 现在被展开的列表小部件覆盖,所需的输出是移动 item2,这样在列表小部件中添加新项目后不会覆盖它下面的项目在同一个树小部件中。

【问题讨论】:

由于您的帖子不清楚,您能否展示一下您得到的和想要得到的图像 【参考方案1】:

您可以对树进行子类化并连接模型的 rowsInsertedrowsRemoved 信号,然后相应地更新几何,包括项目的几何:

class TreeWidget(QtWidgets.QTreeWidget):
    def setItemWidget(self, item, column, widget):
        super().setItemWidget(item, column, widget)
        if isinstance(widget, MyListWidget):
            widget.model().rowsInserted.connect(
                lambda: self.updateItemWidget(item, column))
            widget.model().rowsRemoved.connect(
                lambda: self.updateItemWidget(item, column))

    def updateItemWidget(self, item, column):
        widget = self.itemWidget(item, column)
        item.setSizeHint(column, widget.sizeHint())
        self.updateGeometries()

【讨论】:

以上是关于调整 QTreeWidget 内的小部件大小(使用 setItemWidget 设置)?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据应用程序小部件中文本视图中的小部件大小调整文本大小?

包含小部件和设置行高问题的 QTreeWidget

Pyqt QMdiSubWindow 使用可变数量的小部件调整大小

如何使用“自动调整大小”避免 Android 中的小部件重叠。

将 headerView 添加到小部件上的小部件中的 listView 调整大小 android

PyQt 中的半可调整大小的小部件