2010-08-26 3 views
2

J'ai un ensemble global de valeurs, par ex. ["Foo", "Bar", "Baz", "Quux"]. Chaque ligne de mon TreeView représente une entité qui ne peut traiter qu'un sous-ensemble de ces valeurs. Par exemple, la première ligne pourrait traiter "Foo" et "Bar", et le second, "Bar" et "Quux". Je veux une colonne ComboBox pour permettre à chaque ligne de sélectionner l'une des valeurs qu'elle peut gérer.GtkTreeviewColumn avec un modèle de combinaison différent pour chaque ligne

Cependant, à partir du code que j'ai maintenant, toute la colonne ne peut avoir qu'un seul modèle pour le ComboBox:

crc = gtk.CellRendererCombo() 
crc.set_property('model', fooValuesModel) 
crc.set_property('text-column', 0) 
crc.set_property('editable', True) 
crc.set_property('has_entry', False) 

cl = gtk.TreeViewColumn(ctitle, crc, text=i) 
treeView.append_column(cl) 

J'ai qu'une seule occasion de définir un modèle pour toute la colonne. Existe-t-il un moyen d'avoir des magasins différents pour chaque ligne, ou de filtrer les valeurs d'une manière ou d'une autre?

Répondre

2

Il y a aussi une autre façon de le faire.

Voir aussi: http://mail.gnome.org/archives/gtk-perl-list/2005-July/msg00065.html

(Il est en Perl, mais ne devrait pas être trop difficile à convertir en python)

Le secret étant ceci:

Supposons que vous avez un TreeView en utilisant un TreeStore comme son modèle. Et l'une des colonnes utilise un CellRenderer combobox qui obtenir un modèle ListStore par ligne:

  1. Vous pouvez mettre ListStore en colonnes TreeStore, en perl qui serait une colonne de type Gtk2::ListStore. Bien sûr, vous n'ajouteriez pas une colonne à TreeView affichant ceci directement. Au lieu de cela:

  2. Vous pouvez avoir la comboboxcell colonne utiliser cette colonne du TreeView comme ListStore lorsque vous ajoutez à l'arborescence, en utilisant « insert_column_with_attributes » et connecter le « modèle » attribuer à la colonne ListStore du TreeStore.

  3. Lorsque vous ajoutez une ligne à la vue arborescente, il suffit de mettre un ListStore complet dans la colonne ListStore du TreeStore. Vous pouvez ensuite remplir le ListStore par ligne avec les valeurs souhaitées.

+0

ah a beaucoup de sens! semble être la meilleure solution pour le moment – Claudiu

2

Ce que vous cherchez est gtk.TreeModelFilter. C'est un modèle d'arbre contenant des valeurs filtrées d'un autre modèle d'arbre sous-jacent. Vous pouvez décider quelles lignes doivent être visibles en appelant set_visible_func() sur le modèle filtré.

+0

Comment déclencher le changement de modèle? Quelque chose de mieux que 'cursor-changed' sur' TreeView'? – bobince

+0

@bobince, malheureusement pas aussi loin que je peux penser. Vous pouvez appeler 'refilter()' sur le modèle quand vous voulez le changer, mais je pense que 'cursor-changed' est la meilleure option pour savoir quel gestionnaire de signal doit faire cela. – ptomato

Questions connexes