2010-10-21 33 views
0

Je veux empiler deux arborescences l'une sur l'autre et aligner les colonnes. Je pensais que le moyen de le faire serait d'utiliser un gtk.SizeGroup en quelque sorte. Cependant, gtk.TreeViewColumn n'est pas un widget ... comment puis-je faire cela?Ajouter des colonnes gtk.TreeView à un groupe de taille

+0

J'ai essayé de définir des widgets personnalisés pour les en-têtes et les ajouter à un groupe de taille, mais cela n'a pas fonctionné. aussi n'a pas fonctionné inspecte les widgets dans une vue d'arbre avec forall et essayant de classer les variables correspondantes. – Claudiu

Répondre

1

J'ai deux suggestions:

  1. Regardez comment gtk.SizeGroup est mis en œuvre et voyez si vous pouvez écrire votre propre TreeViewColumnSizeGroup.
  2. Connectez-vous à notify::width de chaque colonne et, dans le rappel, définissez la largeur de la colonne correspondante dans l'autre arborescence.
+0

le problème semble être que TreeViewColumn est juste un objet qui est utilisé pour aider l'arbre à dessiner les colonnes, mais ce n'est pas le widget réel qu'il utilise. il semble donc n'avoir aucun événement 'notify', donc je ne suis pas sûr de savoir comment je ferais # 1 soit – Claudiu

+0

ohh je l'ai maintenant .. je ne comprenais pas comment notifier les événements fonctionnait ([cette réponse] (http: // stackoverflow.com/questions/3999146/detect-when-column-in-gtk-treeview-is-resized/3999311#3999311) effacé) – Claudiu

+0

léger problème aveC# 2: je ne peux pas réduire le widget maintenant, car un d'entre eux a une largeur fixe, ce qui fait que la fenêtre reste à la taille. – Claudiu

0

MISE À JOUR: Ceci est le code final qui a fonctionné. Dans une boucle Je construis les deux colonnes de la vue en même temps, de sorte que cette ligne est suffisante:

col1.connect("notify::width", lambda col1,_,col2:col2.set_fixed_width(
    col1.get_width()), col2) 

Je pense que la raison pour laquelle il n'y a pas « widget colonne » est que la zone principale est juste gtk.gdk.Drawable où chacun des moteurs de rendu de cellules tire leur substance. Cependant, chaque colonne a des en-têtes qui sont des widgets, donc nous pouvons les utiliser pour faire ce que nous voulons.

Choisissez une vue comme étant 'principale' et définissez l'autre sur gtk.TREE_VIEW_COLUMN_FIXED. Utilisez .forall() pour parcourir les widgets enfants internes de la vue "principale". Ceux-ci seront gtk.Buttons représentant les en-têtes de colonne. Connectez-vous à leur événement size-allocate. Sur ce gestionnaire d'événements, obtenez la largeur demandée et .set_fixed_width de la colonne correspondante dans la vue esclave.

self._svcols = [] 
    def sizealloc(wid, alloc): 
     ci = self._svcols.index(wid) 
     cl = self.slaveView.get_column(ci) 
     cl.set_fixed_width(alloc.width) 

    def resizes(child): 
     child.connect('size-allocate', sizealloc) 
     self._svcols.append(child) 

    self.mainView.forall(resizes) 

Ceci fonctionne même si les en-têtes de colonne ne sont pas affichés.