2017-03-22 41 views
0

빠른 답변입니다. 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_()) 
+0

안녕하세요 @Dariusz. 저는 다른 생각을하고 문서를 좀 더 깊이 들여다 보았습니다. QTableWidgets/setThreadViews는 QTableWidget :: setRowHeight (int index, int height) 함수를 사용하여 수정할 수있는 동적 행 높이를 내장하고 있습니다. QTreeWidget을 사용하여 잠겨 있습니까? 아니면 대신 QTableWidget을 사용할 수 있습니까? – aatwo

+0

안녕하세요. 이 문제에 대한 작업을 다시 시작했습니다. QTablewidgets이 작동하는지 확실하지 않은 경우, QTreeWidget과 같이 행을 위/아래/그룹으로 이동할 수 있습니까? 몇 가지 기본 테스트를 시도했지만 지금까지 아무런 운도가 – Dariusz

+0

그래서 데이터 구조에 따라 다릅니다. 실제로 QTreeViews 기능의 트리 부분, 즉 하나 이상의 행이 다른 행의 하위 항목 인 경우, 불행히도 당신은 꽤 많이 잠겨 있습니다. 행 높이에 대한 뛰어난 컨트롤을 지적하고 싶었습니다!확실히 행을 위/아래로 이동할 수 있습니다. – aatwo

답변

0

은 내가 아는 한 당신이 (PyQt: How Can I set row heights of QTreeView)

또는 내가 상상 QTreeView + QSortFilterProxyModel 서브 클래스 쌍으로 테이블을 구현하여 동적 행 높이를 달성 할 수 있지만 직접 행의 크기를 조정하는 방법은 없습니다 테이블 (removeItemWidget)에서 위젯을 제거한 다음 즉시 다시 추가하면 테스트하지는 않았지만 행 크기 재 계산이 발생합니다.

  • Qt는 레이아웃 채우고 크기를 조정하는 느린 : 테이블 내부의 레이아웃이 설정에 대한 내 의견에 관해서는

    , 그것은 두 가지를 주목할 필요가있다.

  • 가변 행 높이가있는 Qt 테이블은 일반적으로 느립니다.

500이라는 숫자는 거대한 수가 아닙니다. 나는 아마도 빠른 프로토 타입을 노크하고 성능 범위가 적합한지를보기 위해 다양한 머신에서 어떻게 수행되는지보고, 너무 느리면 다른 루트를 탐색하는 것에 대해 걱정할 것입니다. 이 경우의 성능은 레이아웃이 얼마나 복잡한 지에 따라 크게 달라집니다.

+0

안녕하세요 @ aatwo removeItemWidget 제안을 주셔서 감사합니다, 나는 그것에 대해 생각하고 있어요. 문제 해결에 대한 현재 시도의 예제 코드를 추가했습니다 ... 새로운 근거. – Dariusz