2016-06-07 129 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)