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