QTreeWidget - пересчитать высоту строки для содержимого строки?

Это быстрый. Я поместил QWidget с макетом, содержащим 10 кнопок в каждом из моих QTreeWidgetItem, который я могу развернуть-свернуть.

Если я заключаю контракт с QWidget(скрыть), строка остается той же высоты. Его размер должен быть меньше, чтобы он содержал только непрозрачную кнопку. Пространство, занимаемое строкой, остается пустым. Только когда я добавляю новый виджет. Высота строки пересчитывается. То же самое касается расширения. Если развернуть виджет, он все равно будет 17 пикселей в высоту. Только когда я добавляю новый виджет, высота строки пересчитывается.

Есть ли в QTreeWidget встроенная функция, которую я могу вызвать для обновления высоты строки - содержимого, или мне нужно циклически перемещаться по каждому элементу и регулировать его высоту вручную?

Также стоит ли помещать QWidget, содержащий макет и множество виджетов, в QTreeWidgetItem? Если я хочу иметь, скажем, 500 QtreeWidgetItems, в каждом из которых есть QTreeWidget с 20 кнопками и т. Д.?

С уважением, Дариуш

Edit1.

Я трачу на это немало времени. Пробовал разные пути но пока не повезло. Я приложил свой грубый код, чтобы показать проблему. Просто нажмите на скрыть 1-2 раза, чтобы увидеть, что происходит. Я изо всех сил пытаюсь понять, как работает "sizeHint" Thini...

Прикрепил мой тест ниже.

import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

sys._excepthook = sys.excepthook


def my_exception_hook(exctype, value, traceback):
    # print(exctype, value, traceback)
    sys._excepthook(exctype, value, traceback)
    sys.exit(1)


sys.excepthook = my_exception_hook


class myWidget(QWidget):
    def __init__(self, parent, something):
        super(QWidget, self).__init__()
        self.MW = parent
        self.MWa = something
        self.lay_main = QGridLayout()
        self.setLayout(self.lay_main)

        self.le_lineA = QLineEdit()
        self.btn_a = QPushButton("Hey")
        self.btn_a.clicked.connect(self.hideunhide)
        self.subWidget = QWidget()
        self.subLay = QGridLayout()
        self.subWidget.setLayout(self.subLay)

        self.btn_b = QPushButton("Boo")
        self.lay_main.addWidget(self.btn_a)
        self.lay_main.addWidget(self.subWidget)
        self.subLay.addWidget(self.le_lineA)
        self.subLay.addWidget(self.btn_b)
        print("Im created :- )")
        self.size = False

    def hideunhide(self):
        if self.subWidget.isHidden():
            self.subWidget.show()
            self.size = True
            self.MW.sizeHint(1)
            self.MW.setSizeHint(0, QSize(0, 0))

        else:
            self.subWidget.hide()
            self.size = False
            self.MW.sizeHint(1)
            self.MW.setSizeHint(0, QSize(0, 0))


class widgetItemDictUpdate(QTreeWidgetItem):
    def __init__(self, parent, MW, title, dicId):
        super(QTreeWidgetItem, self).__init__(parent)
        self.MW = MW
        self.dicId = dicId


class myDelegate(QItemDelegate):
    def __init__(self, mw):
        self.MW = mw
        super(QItemDelegate, self).__init__()

    def sizeHint(self, option, index):
        print("myDelegate", option, index)
        if self.MW.itemFromIndex(index).layer.size:
            return QSize(100, 100)
        return QSize(100, 30)


class treeWidget(QTreeWidget):
    def __init__(self, MW):
        QTreeWidget.__init__(self)
        self.setUniformRowHeights(False)
        self.MW = MW
        self.itemClicked.connect(self.printClick)
        self.setHeaderItem(QTreeWidgetItem(["Name", "ProgressBar", "extra", "", "", "", "", "", "", "", ""]))
        self.setDragDropMode(QAbstractItemView.InternalMove)
        self.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.dragItems = []

        self.lastHidenItemsArray = []
        self.hiddenItemsSet = []

        self.delg = myDelegate(self)
        self.setItemDelegate(self.delg)
        self.addItems(self.invisibleRootItem())

    def printClick(self, item, column):
        print("Clicked")

    def addItems(self, parent):
        testParent = self.addSlave(parent, 'RandomA', 50)
        testParent = self.addSlave(parent, 'RandomB', 60)
        testParent = self.addSlave(parent, 'RandomBX', 60)
        testParent = self.addSlave(parent, 'RandomBcvas', 60)

    def addSlave(self, parent, title, id, expanded=True, visible=True):
        item = widgetItemDictUpdate(parent, self, title, id)
        myLayer = myWidget(item, self)
        item.setText(0, title)
        item.layer = myLayer
        self.setItemWidget(item, 1, myLayer)
        item.id = id
        item.type = 1

        return item


class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.treeWidget = treeWidget(self)
        layout = QVBoxLayout()
        layout.addWidget(self.treeWidget)
        self.setLayout(layout)
        self.setGeometry(1000, 500, 500, 500)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

1 ответ

Насколько мне известно, нет способа напрямую изменить размер строк, хотя вы можете достичь динамической высоты строки, реализовав вашу таблицу в виде пары подклассов QTreeView + QSortFilterProxyModel ( PyQt: Как установить высоту строк в QTreeView)

В качестве альтернативы я представляю себе удаление виджета из таблицы (removeItemWidget), а затем мгновенное его повторное добавление приведет к пересчету размера строки, хотя я этого не проверял.

Что касается моего мнения относительно этой настройки раскладок внутри таблиц, то стоит отметить две вещи:

  • Макеты Qt медленно заполняются и изменяются.
  • Таблицы Qt с переменной высотой строк в целом медленны.

Это, как говорится, 500 не огромное количество. Я бы, вероятно, собрал бы быстрый прототип и посмотрел бы, как он работает на разных машинах, чтобы увидеть, является ли производительность приемлемым, а затем беспокоиться о том, чтобы исследовать другие маршруты, если он слишком медленный. Я ожидаю, что производительность в этом случае будет в наибольшей степени зависеть от сложности макетов.

Другие вопросы по тегам