繁体   English   中英

PyQt5中QTreeWidget的动态大小

[英]Dynamic size of QTreeWidget in PyQt5

我有一个QTreewidget,我希望它尽可能小,可能只有一个分支。 但我希望尺寸根据其扩展或折叠方式而变化。 以及从适合小部件填充部分的大小开始。

我通过添加QTreeWidgetItems(使TreeWidget作为父级),然后再次使QTreeWidgetItems(使上述QTreeWidgetItem作为父级)来制作QTreewidget。

现在,它像左图一样开始,但是我希望它像右图一样开始。(这是您调整窗口大小时的最小尺寸。)

不需要的 通缉

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

  • 另外,我如何调整它的大小,比如说缩进的复选框消失(隐藏)时我重新调整它的大小,因此占用的空间更少。 现在,最小尺寸仍然是可见的。

  • 奖励:当我更改样式时,最小尺寸变小,即使我不知道更改了什么,也使滚动条达到了最小尺寸,因为它仅在更改样式表时发生。

根据要求,这里是代码,这很混乱,因为它正在进行中。 这是我做树的班。

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())

在此处输入图片说明

我找到了一个解决这两个问题的解决方案(最小尺寸和动态尺寸更改)

这需要一些工作,其中一些是我在示例中所没有的简化代码。 但从本质上讲,我有一个功能可检查子复选框的排他性。 因此,我使用setData函数定义它是父复选框还是子复选框。 (子复选框)我敢肯定有一种更简单的方法,但是我是新来的...

使用排他性功能,我检查它是父母还是孩子。 如果是孩子,它将贯穿他们,并获得父母和孩子的数量。 然后,我只使用每个值并乘以父项/子项的大小。 然后从中设置高度。 如果父母双亲倒塌,则其身高不在计算尺寸之内。 然后,我只需在每个父项更改后重新计算大小即可。

这允许最小的尺寸,以及在扩展/折叠时动态调整大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM