빠른 답변입니다. QTreeWidgetItem 각각에 10 개의 버튼이 포함 된 레이아웃이있는 QWidget을 배치하여 확장 할 수 있습니다.QTreeWidget - 행 내용 당 행 높이 다시 계산 하시겠습니까?
QWidget (hide)을 계약하면 행은 동일한 높이로 유지됩니다. 숨김 버튼 만 포함하려면 크기를 줄여야합니다. 행이 차지하는 공간은 비어 있습니다. 새 위젯을 추가 할 때만. 행의 높이가 다시 계산됩니다. 확장 할 때도 마찬가지입니다. 위젯을 확장해도 여전히 높이가 17 픽셀입니다. 새 위젯을 추가 할 때만 행의 높이가 다시 계산됩니다.
QTreeWidget에 행 높이 - 콘텐츠를 업데이트하기 위해 호출 할 수있는 내장 함수가 있습니까? 아니면 각 항목을 반복하고 높이를 수동으로 조정해야합니까?
QTreeWidgetItem 안에 레이아웃과 많은 위젯을 포함하는 QWidget을 넣는 것도 좋은 생각입니까? 500 개 QtreeWidgetItems, 20 개의 Buttons/etc 아이템이있는 QTreeWidget을 가지고 있습니다.
감사 다리우스
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_())
안녕하세요 @Dariusz. 저는 다른 생각을하고 문서를 좀 더 깊이 들여다 보았습니다. QTableWidgets/setThreadViews는 QTableWidget :: setRowHeight (int index, int height) 함수를 사용하여 수정할 수있는 동적 행 높이를 내장하고 있습니다. QTreeWidget을 사용하여 잠겨 있습니까? 아니면 대신 QTableWidget을 사용할 수 있습니까? – aatwo
안녕하세요. 이 문제에 대한 작업을 다시 시작했습니다. QTablewidgets이 작동하는지 확실하지 않은 경우, QTreeWidget과 같이 행을 위/아래/그룹으로 이동할 수 있습니까? 몇 가지 기본 테스트를 시도했지만 지금까지 아무런 운도가 – Dariusz
그래서 데이터 구조에 따라 다릅니다. 실제로 QTreeViews 기능의 트리 부분, 즉 하나 이상의 행이 다른 행의 하위 항목 인 경우, 불행히도 당신은 꽤 많이 잠겨 있습니다. 행 높이에 대한 뛰어난 컨트롤을 지적하고 싶었습니다!확실히 행을 위/아래로 이동할 수 있습니다. – aatwo