PyQt5中QTreeWidget的动态大小

时间:2017-07-15 22:55:45

标签: python pyqt pyqt5 qtreewidget

我有一个QTreewidget,我希望尽可能小,可能只有一个分支。但我希望大小相应地改变扩展或崩溃的方式。以及适合小部件填充部分的大小开始。

我通过添加QTreeWidgetItems来创建QTreewidget,它将TreeWidget作为父级,然后再次生成QTreeWidgetItems,将上面的QTreeWidgetItem作为父级。

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

Unwanted Wanted

  • 如何让它在开始时调整到最小尺寸?

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

  • 奖励:当我改变风格时,最小尺寸变得更小并且让我获得最小尺寸的滚动条,尽管不知道我改变了什么,因为它只在我更改样式表时发生。

根据要求,这是代码,它是一堆乱七八糟的东西,因为它正在进行中。这是我为制作树而制作的课程。

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

这只是放在上面图片的小部件中。该类接受一个dict,其中包含name / options / tooltip的信息和一个包含名称的列表,最终生成子复选框。这样做了4次,所以4个树的小部件。

此外,这是一个可以传递给类的dict,以实现它。虽然,并非全部使用。

optiondict={
        "Active option": 1,
        "Command": "",
        "dependency": None,
        "name": "Convert to audio",
        "options": [
            "mp3",
            "aac",
            "flac"
        ],
        "state": True,
        "tooltip": "Text here"
    }

2 个答案:

答案 0 :(得分:1)

布局设置尺寸,它们通过窗口小部件的minimumHeight()功能获取建议值,但此尺寸与您想要的不匹配。

在您的情况下,您只想减小窗口小部件的高度,我们必须使用sizeHint()设置最小高度,而不是在函数{{1}的帮助下使用建议值设置的宽度}}

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

答案 1 :(得分:0)

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

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

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

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