如何计算 QTreeWidget 内容的高度?
How to compute the height of a QTreeWidget content?
我想要一个 QTreeWidget
,它有一个首选高度,可以在没有滚动条的情况下显示所有内容。用例有两个:1) QVBoxLayout
中的树与其内容成比例 space 和 2) QScrollArea
中的树,其中所有树应该只有一个滚动条而不是单个滚动条。
我尝试查询树及其视口,但无论它们有多少内容,它们总是 return 相同的值:
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)
但所有项目 return 大小为 (-1, -1)。即使在显示树之后,而不仅仅是在构建期间。
那么如何计算树的高度?
技巧似乎是查询 header 的宽度,查询树的各个行高,并在所有边上添加 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)
我想要一个 QTreeWidget
,它有一个首选高度,可以在没有滚动条的情况下显示所有内容。用例有两个:1) QVBoxLayout
中的树与其内容成比例 space 和 2) QScrollArea
中的树,其中所有树应该只有一个滚动条而不是单个滚动条。
我尝试查询树及其视口,但无论它们有多少内容,它们总是 return 相同的值:
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)
但所有项目 return 大小为 (-1, -1)。即使在显示树之后,而不仅仅是在构建期间。
那么如何计算树的高度?
技巧似乎是查询 header 的宽度,查询树的各个行高,并在所有边上添加 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)