PyQt5中QTreeWidget的动态大小
我得到了一个QTreewidget,我希望尽可能小,可能只有一个分支。但我希望大小根据扩展或崩溃的方式而改变。以及从适合填充部件的尺寸开始。PyQt5中QTreeWidget的动态大小
我通过添加QTreeWidgetItems(其获得TreeWidget作为父项),然后再次创建QTreeWidgetItems(其获得上述QTreeWidgetItem作为父项)来制作QTreewidget。
现在,它开始像左边的图像,但我希望它开始像正确的。(这是最小尺寸是什么,当你调整窗口大小。)
如何在开始时将其大小调整为最小尺寸?
另外,我怎样才能调整它,说我调整它时,缩进复选框消失(隐藏),以便占用更少的空间。现在,最小尺寸仍然是什么,当它们是可见的时候。
Bonus:当我改变样式时,最小尺寸变得更小,并且让我得到最小尺寸的滚动条,尽管不知道我改变了什么,因为它只发生在我更改样式表时。
根据要求,这是代码,这是一大堆混乱,因为它只是在进行中。这是我制作树的课程。
class paramTree(QTreeWidget):
def __init__(self, Options: dict):
super().__init__()
self.setExpandsOnDoubleClick(False)
self.setHeaderHidden(True)
self.setRootIsDecorated(False)
self.Main = self.makeOption(Options['name'], self, Options['state'],0,Options['tooltip'])
self.Options=[]
if Options['options'] is not None:
print(Options['options'])
for number, choice in enumerate(Options['options']):
if Options['Active option'] == number:
sub = self.makeOption(choice, self.Main,True,1)
sub.setFlags(sub.flags()^Qt.ItemIsUserCheckable)
else:
sub = self.makeOption(choice, self.Main,False,1)
self.Options.append(self.indexFromItem(sub))
def makeOption(name, parent, checkstate, level=0, tooltip=None):
mainItem = QTreeWidgetItem(parent,[name])
if tooltip:
mainItem.setToolTip(0,tooltip)
if checkstate:
mainItem.setCheckState(0, Qt.Checked)
else:
mainItem.setCheckState(0, Qt.Unchecked)
mainItem.setExpanded(True)
return mainItem
这只是放在上图中的小部件。该类需要一个字典,其中包含名称/选项/工具提示信息和带名称的列表,最终生成子复选框。这是完成4次,所以4个treewidgets。
此外,这是一个可以传递给班级的词典。虽然并非全部都使用了。
optiondict={
"Active option": 1,
"Command": "",
"dependency": None,
"name": "Convert to audio",
"options": [
"mp3",
"aac",
"flac"
],
"state": True,
"tooltip": "Text here"
}
布局设置的大小,他们采取通过小部件的sizeHint()
功能推荐值,但这个尺寸不匹配你想要什么。
与你的情况一样,你只需要减小窗口部件的高度,我们必须用minimumHeight()
来设置最小高度,而不是我们在函数sizeHint()
的帮助下用推荐值设置的宽度。
self.resize(self.sizeHint().width(), self.minimumHeight())
实施例:
class Widget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setLayout(QVBoxLayout())
optiondict={
"Active option": 1,
"Command": "",
"dependency": None,
"name": "Convert to audio",
"options": [
"mp3",
"aac",
"flac"
],
"state": True,
"tooltip": "Text here"
}
for i in range(4):
w = paramTree(optiondict)
self.layout().addWidget(w)
self.resize(self.sizeHint().width(), self.minimumHeight())
这确实有效。但我注意到了2件事。 MinimumHeight为0.并且在更改样式表时,最小高度仍然为0,但实际窗口并不那么大,使得滚动条不应该在没有设置样式表的情况下进行。我需要研究一下。目前,我手动设置最小尺寸。 – Thomasedv
您的代码是否与示例结构类似,即分配布局之后?您讨论的是样式表,但不显示任何内容,所以我无法帮助您。 – eyllanesc
不需要任何帮助:)我解决了它。我刚刚提到它,因为样式表更改(而不是treewidget本身)如何影响minimumHeight是令人困惑的。显然,滚动条的宽度就是这样。所以我需要改变一些东西。我也最终做出了与答案不同的事情,因为当QTreeWidgets的大小不一样时,我发现它不太合适。我可能会做出回答,详细说明我做了什么,因为它也解决了扩大/缩小的大小变化。 – Thomasedv
我发现,解决这两个点中的溶液(最小可能的尺寸,并且动态大小变化)
它需要一些工作,有些例外的简化代码被排除在外。但实质上,我有一个函数可以检查子检查框的排他性。所以我使用setData函数来定义它是父级复选框还是子复选框。 (子检查框)我确信有一个更简单的方法,但我在这方面是新的...
使用排他性功能,我检查它是父母还是孩子。如果它是一个孩子,它贯穿他们,并获得父母和孩子的数量。然后,我只是使用每个值并乘以父/子项的大小。然后从那里设置高点。如果父母被折叠,那么它的小孩不包含在大小的计算中。然后,我只需在每个父项目更改后重新计算大小。
这允许尽可能小的尺寸,以及在展开/折叠时动态调整大小。
请显示您的代码 – eyllanesc
开头显示的大小不取决于QTreeWidget,但取决于布局。 – eyllanesc
@eyllanesc添加了代码。我使用QVBoxLayout来添加自定义的QTreeWidget,但是在创建之前或之后添加拉伸,对整体形状没有影响。 – Thomasedv