2017-07-15 6 views
0

J'ai un QTreeWidget, que je veux être aussi petit que possible, avec probablement une seule branche. Mais je veux que la taille change en fonction de la façon dont cela se dilate ou s'effondre. Ainsi que commencer avec une taille qui correspond à la partie remplie du widget.Taille dynamique de QTreeWidget dans PyQt5

Je crée le QTreewidget en ajoutant QTreeWidgetItems, qui a reçu TreeWidget en tant que parent, puis en faisant à nouveau QTreeWidgetItems qui a obtenu QTreeWidgetItem en tant que parent.

En ce moment, il commence comme image de gauche, mais je veux que ça commence comme celui de droite. (Ce qui est ce que la taille minimale est, lorsque vous redimensionnez la fenêtre.)

UnwantedWanted

  • Comment puis-je redimensionner à la taille minimale au démarrage?

  • Aussi, comment puis-je le redimensionner, disons le redimensionner quand les cases à cocher en retrait ont disparu (caché), ce qui prend encore moins d'espace. À l'heure actuelle, la taille minimale est toujours ce qu'elle est, quand ceux-ci sont visibles. Bonus: Quand j'ai changé le style, la taille minimum est devenue plus petite et m'a fait obtenir des barres de défilement à taille minimum, bien que je ne sache pas ce que j'ai changé, comme cela arrive seulement quand je change la feuille de style.

Sur demande, voici le code, c'est beaucoup de désordre, car c'est juste un travail en cours. Voici la classe que j'ai faite pour faire l'arbre.

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 

Ceci est juste mis dans un widget dans les images ci-dessus. La classe prend une dict, qui a des informations pour le nom/options/tooltip et une liste avec des noms, qui finissent par faire les cases à cocher sous. Ceci est fait 4 fois, donc 4 treewidgets.

En outre, voici une dict qui peut être passée à la classe, pour le faire. Cependant, tout n'est pas utilisé.

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

montrez votre code s'il vous plaît – eyllanesc

+0

La taille affichée au début ne dépend pas de QTreeWidget mais dépend de la disposition. – eyllanesc

+0

@eyllanesc Ajout du code. J'ai utilisé un QVBoxLayout pour ajouter le QTreeWidget personnalisé, mais l'ajout de stretch, avant ou après, n'a aucun effet sur la forme générale à la création. – Thomasedv

Répondre

1

Layouts définir les tailles, ils prennent la valeur recommandée par la fonction sizeHint() des widgets, mais cette taille ne correspond pas à ce que vous voulez. Comme dans votre cas, vous voulez seulement réduire la hauteur du widget, nous devons définir la hauteur minimale avec minimumHeight(), au lieu de la largeur que nous lui donnons avec la valeur recommandée à l'aide de la fonction sizeHint().

self.resize(self.sizeHint().width(), self.minimumHeight()) 

Exemple:

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

Cela fonctionne en effet. J'ai cependant noté 2 choses. MinimumHeight est 0. Et lors de la modification de la feuille de style, la hauteur minimale est toujours 0, mais la fenêtre réelle n'est pas aussi grande, ce qui rend les barres de défilement où il n'aurait pas dû être sans définir de feuille de style. Je vais devoir regarder ça. Pour l'instant, je définis manuellement la taille minimale. – Thomasedv

+0

Est-ce que le code que vous avez structuré est similaire à l'exemple, c'est-à-dire après avoir assigné les mises en page?, Vous parlez de feuille de style mais n'en montrez pas, donc je ne peux pas vous aider. – eyllanesc

+0

Pas besoin d'aide :) Je l'ai résolu. Je viens de le mentionner, car il était déroutant de savoir comment les changements de feuille de style (pas sur le treewidget lui-même) affecté minimumHeight. Apparemment, la largeur de la barre de défilement fait cela. Donc j'avais besoin de changer quelque chose. J'ai également fini par faire une chose différente à la réponse, comme je l'ai découvert, il ne serait pas bien quand la taille de la QTreeWidgets n'était pas la même chose. Je vais probablement faire une réponse en détail sur ce que j'ai fait, car il aborde également le changement de taille d'un expand/collapse. – Thomasedv

0

Je trouve une solution qui répond à la fois des points (plus petite taille possible, et le changement de taille dynamique)

Il faut un peu de travail, certains exclus du code simplifié que j'ai dans l'exemple. Mais en substance, j'ai une fonction qui vérifie les sous-boites pour l'exclusivité. J'utilise donc la fonction setData pour définir s'il s'agit d'une case parent ou d'une case enfant. (subcheckbox) Je suis sûr qu'il y a un moyen plus facile, mais je suis nouveau à ce sujet ...

En utilisant la fonction d'exclusivité, je vérifie s'il s'agit d'un parent ou d'un enfant. Si c'est un enfant, il les traverse et obtient le nombre de parents et d'enfants. Ensuite, j'utilise chaque valeur et je la multiplie avec la taille d'un élément parent/enfant. Et puis définir la hauteur de cela. Si un parent est réduit, ses enfants ne sont pas inclus dans le calcul de la taille. Ensuite, je recalcule simplement la taille après chaque changement d'élément parent.

Ceci permet une taille la plus petite possible, ainsi qu'un redimensionnement dynamique lors de l'expansion/l'effondrement.