2017-07-15 47 views
0

我得到了一个QTreewidget,我希望尽可能小,可能只有一个分支。但我希望大小根据扩展或崩溃的方式而改变。以及从适合填充部件的尺寸开始。PyQt5中QTreeWidget的动态大小

我通过添加QTreeWidgetItems(其获得TreeWidget作为父项),然后再次创建QTreeWidgetItems(其获得上述QTreeWidgetItem作为父项)来制作QTreewidget。

现在,它开始像左边的图像,但我希望它开始像正确的。(这是最小尺寸是什么,当你调整窗口大小。)

UnwantedWanted

  • 如何在开始时将其大小调整为最小尺寸?

  • 另外,我怎样才能调整它,说我调整它时,缩进复选框消失(隐藏),以便占用更少的空间。现在,最小尺寸仍然是什么,当它们是可见的时候。

  • 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" 
    } 
+0

请显示您的代码 – eyllanesc

+0

开头显示的大小不取决于QTreeWidget,但取决于布局。 – eyllanesc

+0

@eyllanesc添加了代码。我使用QVBoxLayout来添加自定义的QTreeWidget,但是在创建之前或之后添加拉伸,对整体形状没有影响。 – Thomasedv

回答

1

布局设置的大小,他们采取通过小部件的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()) 

enter image description here

+0

这确实有效。但我注意到了2件事。 MinimumHeight为0.并且在更改样式表时,最小高度仍然为0,但实际窗口并不那么大,使得滚动条不应该在没有设置样式表的情况下进行。我需要研究一下。目前,我手动设置最小尺寸。 – Thomasedv

+0

您的代码是否与示例结构类似,即分配布局之后?您讨论的是样式表,但不显示任何内容,所以我无法帮助您。 – eyllanesc

+0

不需要任何帮助:)我解决了它。我刚刚提到它,因为样式表更改(而不是treewidget本身)如何影响minimumHeight是令人困惑的。显然,滚动条的宽度就是这样。所以我需要改变一些东西。我也最终做出了与答案不同的事情,因为当QTreeWidgets的大小不一样时,我发现它不太合适。我可能会做出回答,详细说明我做了什么,因为它也解决了扩大/缩小的大小变化。 – Thomasedv

0

我发现,解决这两个点中的溶液(最小可能的尺寸,并且动态大小变化)

它需要一些工作,有些例外的简化代码被排除在外。但实质上,我有一个函数可以检查子检查框的排他性。所以我使用setData函数来定义它是父级复选框还是子复选框。 (子检查框)我确信有一个更简单的方法,但我在这方面是新的...

使用排他性功能,我检查它是父母还是孩子。如果它是一个孩子,它贯穿他们,并获得父母和孩子的数量。然后,我只是使用每个值并乘以父/子项的大小。然后从那里设置高点。如果父母被折叠,那么它的小孩不包含在大小的计算中。然后,我只需在每个父项目更改后重新计算大小。

这允许尽可能小的尺寸,以及在展开/折叠时动态调整大小。