PyQt5中QTreeWidget的动态大小
Dynamic size of QTreeWidget in PyQt5
我有一个 QTreewidget,我希望它尽可能小,可能只有一个分支。但我希望大小根据扩展或折叠的方式相应地改变。以及从适合小部件填充部分的尺寸开始。
我通过添加 QTreeWidgetItems 来制作 QTreewidget,它将 TreeWidget 作为父对象,然后再次制作 QTreeWidgetItems,将上面的 QTreeWidgetItem 作为父对象。
现在,它像左图一样开始,但我希望它像右图一样开始。(当您调整 window 大小时,这是最小尺寸。)
如何让它在开始时调整到最小尺寸?
此外,我如何调整它的大小,比如说当缩进的复选框消失(隐藏)时我调整它的大小,这样花费的时间更少 space。现在,当它们可见时,最小尺寸仍然是原来的尺寸。
奖励:当我更改样式时,最小尺寸变小并使我获得最小尺寸的滚动条,尽管我不知道我更改了什么,因为它只发生在我更改样式表时。
根据要求,这是代码,它是一堆乱七八糟的东西,因为它只是在进行中。这是我为制作这棵树而制作的 class。
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
这只是放在上图中的一个小部件中。 class 接受一个字典,其中包含 name/options/tooltip 的信息和一个名称列表,最终形成子复选框。这样做了 4 次,所以有 4 个 treewidgets。
此外,这里有一个可以传递给 class 的字典。虽然,并不是所有的都被使用。
optiondict={
"Active option": 1,
"Command": "",
"dependency": None,
"name": "Convert to audio",
"options": [
"mp3",
"aac",
"flac"
],
"state": True,
"tooltip": "Text here"
}
Layouts设置尺寸,他们通过widgets的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())
我找到了解决这两点的解决方案(最小可能尺寸和动态尺寸变化)
它需要一些工作,有些工作已排除在示例中的简化代码之外。但本质上,我有一个功能可以检查子复选框的排他性。所以我使用 setData 函数来定义它是 parent 复选框还是 child 复选框。 (子复选框)我确定有更简单的方法,但我是新手...
使用排他性函数,我检查它是 parent 还是 child。如果是child,则遍历它们,得到parents和children的数量。然后我只使用每个值并乘以 parent/child 项的大小。然后从中设置高度。如果 parent 被折叠,那么它的孩子不包括在大小的计算中。然后我只需在每个 parent 项更改后重新计算大小。
这允许尽可能小的尺寸,以及根据 expansion/collapse 动态调整尺寸。
我有一个 QTreewidget,我希望它尽可能小,可能只有一个分支。但我希望大小根据扩展或折叠的方式相应地改变。以及从适合小部件填充部分的尺寸开始。
我通过添加 QTreeWidgetItems 来制作 QTreewidget,它将 TreeWidget 作为父对象,然后再次制作 QTreeWidgetItems,将上面的 QTreeWidgetItem 作为父对象。
现在,它像左图一样开始,但我希望它像右图一样开始。(当您调整 window 大小时,这是最小尺寸。)
如何让它在开始时调整到最小尺寸?
此外,我如何调整它的大小,比如说当缩进的复选框消失(隐藏)时我调整它的大小,这样花费的时间更少 space。现在,当它们可见时,最小尺寸仍然是原来的尺寸。
奖励:当我更改样式时,最小尺寸变小并使我获得最小尺寸的滚动条,尽管我不知道我更改了什么,因为它只发生在我更改样式表时。
根据要求,这是代码,它是一堆乱七八糟的东西,因为它只是在进行中。这是我为制作这棵树而制作的 class。
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
这只是放在上图中的一个小部件中。 class 接受一个字典,其中包含 name/options/tooltip 的信息和一个名称列表,最终形成子复选框。这样做了 4 次,所以有 4 个 treewidgets。
此外,这里有一个可以传递给 class 的字典。虽然,并不是所有的都被使用。
optiondict={
"Active option": 1,
"Command": "",
"dependency": None,
"name": "Convert to audio",
"options": [
"mp3",
"aac",
"flac"
],
"state": True,
"tooltip": "Text here"
}
Layouts设置尺寸,他们通过widgets的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())
我找到了解决这两点的解决方案(最小可能尺寸和动态尺寸变化)
它需要一些工作,有些工作已排除在示例中的简化代码之外。但本质上,我有一个功能可以检查子复选框的排他性。所以我使用 setData 函数来定义它是 parent 复选框还是 child 复选框。 (子复选框)我确定有更简单的方法,但我是新手...
使用排他性函数,我检查它是 parent 还是 child。如果是child,则遍历它们,得到parents和children的数量。然后我只使用每个值并乘以 parent/child 项的大小。然后从中设置高度。如果 parent 被折叠,那么它的孩子不包括在大小的计算中。然后我只需在每个 parent 项更改后重新计算大小。
这允许尽可能小的尺寸,以及根据 expansion/collapse 动态调整尺寸。