簡體   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