2016-06-07 170 views
2

我想要一個QTreeWidget,它有一個首選高度,顯示其所有內容,而不顯示滾動條。用例如下:1)QVBoxLayout中的樹木佔用的空間與其內容成比例; 2)樹木在QScrollArea中應該只有一個滾動條而不是單個滾動條。如何計算QTreeWidget內容的高度?

我試着查詢樹及其視,但他們總是返回相同的值,不管他們多麼內容有:

size = PySide.QtCore.QSize(100, 30) 
sizeHint = PySide.QtCore.QSize(256, 192) 
minimumSize = PySide.QtCore.QSize(0, 0) 
minimumSizeHint = PySide.QtCore.QSize(76, 76) 
maximumSize = PySide.QtCore.QSize(16777215, 16777215) 
baseSize = PySide.QtCore.QSize(0, 0) 
frameSize = PySide.QtCore.QSize(100, 30) 
viewport.size = PySide.QtCore.QSize(94, 5) 
viewport.sizeHint = PySide.QtCore.QSize(-1, -1) 
viewport.minimumSize = PySide.QtCore.QSize(0, 0) 
viewport.minimumSizeHint = PySide.QtCore.QSize(-1, -1) 
viewport.maximumSize = PySide.QtCore.QSize(16777215, 16777215) 
viewport.baseSize = PySide.QtCore.QSize(0, 0) 
viewport.frameSize = PySide.QtCore.QSize(94, 5) 

接下來我試着計算大小加入了所有的大小提示爲每個項目:

size = super().sizeHint() 
    height = self.horizontalScrollBar().sizeHint().height() 
    rows = 0 
    it = QtGui.QTreeWidgetItemIterator(self) 
    while it.value() is not None: 
     rows += 1 
     size = it.value().sizeHint(0) 
     height += size.height() 
     it += 1 
    size = QtCore.QSize(size.width(), height) 

但是所有項目都返回(-1,-1)的大小。即使樹顯示後,不僅在施工期間。

那麼我該如何計算樹的高度呢?

+0

也許你需要直接詢問委託大小暗示;比較['QTreeWidgetItem :: setSizeHint()']的文檔(http://doc.qt.io/qt-4.8/qtreewidgetitem.html#setSizeHint)。 – Murphy

+0

文檔說,如果沒有設置大小提示,它會詢問代表。我沒有設置任何代表,所以應該使用默認值。樹只包含普通的QTreeWidgetItems。所以它應該返回每個項目的文本的大小,直到我閱讀文檔。 –

+0

那麼,如果項目對象沒有返回有效的大小,我認爲至少委託人應該能夠計算出它。你有沒有嘗試我的建議? – Murphy

回答

2

訣竅似乎是查詢頭部的寬度,樹個人行高度並添加frameWidth在各方面是這樣的:

class TreeWidget(QtGui.QTreeWidget): 
    def sizeHint(self): 
     print("TreeWidget.sizeHint()") 
     print(" frameWidth = {0}".format(self.frameWidth())) 
     height = 2 * self.frameWidth() # border around tree 
     if not self.isHeaderHidden(): 
      header = self.header() 
      headerSizeHint = header.sizeHint() 
      print(" headerSizeHint = {0}".format(headerSizeHint)) 
      height += headerSizeHint.height() 
     rows = 0 
     it = QtGui.QTreeWidgetItemIterator(self) 
     while it.value() is not None: 
      rows += 1 
      index = self.indexFromItem(it.value()) 
      print(" rowHeight = {0}".format(self.rowHeight(index))) 
      height += self.rowHeight(index) 
      it += 1 
     print(" computed height for {0} rows = {1}".format(rows, height)) 
     return QtCore.QSize(header.length() + 2 * self.frameWidth(), height)