Изменить размер виджета внутри QTreeWidget (устанавливается с помощью setItemWidget)?

У меня есть QListWidget внутри QTreeWidget, и я хочу, чтобы он автоматически регулировал свою высоту при добавлении или удалении строк. У меня работает автоматическое изменение размера 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 таким образом, чтобы после добавления нового элемента внутри виджета списка не закрывался элемент под ним в том же виджет дерева.


person pyjamas    schedule 22.04.2021    source источник
comment
Не могли бы вы показать изображение того, что вы получаете и что вы хотите получить, поскольку ваш пост неясен   -  person eyllanesc    schedule 22.04.2021


Ответы (1)


Вы можете подклассифицировать дерево и соединить сигналы модели rowsInserted и rowsRemoved, а затем соответствующим образом обновить геометрию, включая геометрию элемента:

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()
person musicamante    schedule 22.04.2021