Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算QTreeWidget内容的高度?_Python_Qt_Pyqt_Qt4_Pyside - Fatal编程技术网

Python 如何计算QTreeWidget内容的高度?

Python 如何计算QTreeWidget内容的高度?,python,qt,pyqt,qt4,pyside,Python,Qt,Pyqt,Qt4,Pyside,我想要一个QTreeWidget,它有一个首选的高度,可以在没有滚动条的情况下显示所有内容。这种情况有两种:1)在QVBoxLayout中的树占用与其内容成比例的空间;2)在qscrollara中的树,所有树都应该只有一个滚动条,而不是单个滚动条 我尝试查询树及其视口,但无论它们有多少内容,它们总是返回相同的值: size = PySide.QtCore.QSize(100, 30) sizeHint = PySide.QtCore.QSize(256, 192) minimumSize = P

我想要一个
QTreeWidget
,它有一个首选的高度,可以在没有滚动条的情况下显示所有内容。这种情况有两种:1)在
QVBoxLayout
中的树占用与其内容成比例的空间;2)在
qscrollara
中的树,所有树都应该只有一个滚动条,而不是单个滚动条

我尝试查询树及其视口,但无论它们有多少内容,它们总是返回相同的值:

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)。即使在树显示之后,而不仅仅是在构建期间


那么如何计算树的高度呢?

技巧似乎是查询页眉的宽度,查询树的单个行高度,然后在所有边上添加框架宽度,如下所示:

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)

也许您需要直接向学员询问尺寸提示;比较的文档。文档说如果没有设置大小提示,它会询问代理。我没有设置任何代理,因此应该使用默认代理。树只包含普通的QTreeWidgetItems。因此,在我阅读文档时,它应该返回每个项目的文本大小。如果项目对象没有返回有效的大小,我想至少代理应该能够计算它。您尝试过我的建议吗?没有。我使用了标题中的大小,因为这看起来更直接,并给出了正确的结果。请注意,在self.ishaderhidden()为false的情况下,存在一个小错误,标题没有属性,并且在返回行中崩溃