Referenz von Treeview-Column auf ListStoreColumn (-Nr)

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Hallo,

ich habe die letzten Tage die Klassenreferenz von gtk rauf und runter durchforstet und bin jetzt kurz vor dem Aufgeben. Wahrscheinlich sehe ich aber auch einfach den Wald vor lauter Bäumen nicht mehr. Und deshalb wollte ich doch noch mal die Frage in die Runde werfen, vielleicht hat ja jemand eine Lösung gefunden.

Folgende Situation: Ich habe über Glade ein Treeview und einen dazugehörigen ListStore erstellt.

Der ListStore enthält allerdings mehr Spalten als das TreeView, und auch die Reihenfolge ist eine andere.

Über Glade habe ich den CellRenderern die entsprechenden Spalten des Modells zugewiesen. Die Daten werden auch brav geladen. Soweit alles schön. Jetzt benutze ich dieses Setup aus ListStore + Treeview + ein paar andere Widgets im Programm an verschiedenen Stellen mit verschiedenen Daten (und Liststores). Mein Wunsch ist es, das Binden der Callbacks nach Möglichkeit zu automatisieren. Dazu iteriere ich über TreeView.get_columns() und binde z.B. das "edited"-Signal. Um die neuen Werte aber an das dahinterliegende ListStore geben zu können, brauche ich die Spaltennummer. Die callbacks liefern mir aber immer nur eine Spaltennummer bezogen auf das TreeView, nicht auf das Modell. Wie oben schon beschrieben sind diese nicht notwendigerweise identisch.

Meine Frage ist nun: In Glade habe ich das Mapping TreeView-Column -> ListStore Column ja in den Cellrenderern hinterlegt. Komme ich von Python aus irgendwie an diesen Wert heran?

Als schnelle Lösung bin ich jetzt dazu übergegangen, den Wert "SortColumnId" auszulesen und zu verwenden. Ist aber auch eine wackelige Angelegenheit, weil dieser a) nicht immer sinnvoll gesetzt wird (Schussel, vor allem nach nachträglichen Änderungen am ListStore) und b) ja auch nicht notwendigerweise mit der Datenspalte übereinstimmt.

Kann mich jemand "inspirieren"?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Du kannst den ListStore und den dazugehörigen TreeView irgendwie über den "path" und den "iter" verknüpfen, hab jetzt allerdings auf die Schnelle nicht die exakte Lösung gefunden.

Hab hier aber mal zwei Snippets, die dir eventuell weiterhelfen könnten. Das erste liest den vordersten Wert der aktuell ausgewählten Zeile und das zweite markiert die erste Zeile.

Code: Alles auswählen

col = self.treeview.get_cursor()[0][0]
tree_iter = self.lstore.get_iter(col)
data = int(self.lstore.get(tree_iter, 0)[0])

Code: Alles auswählen

tree_iter = self.lstore.get_iter_first()
path = self.lstore.get_path(tree_iter)
self.treeview.set_cursor(path)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Vielen Dank für deine Mühe, aber es ist leider nicht ganz das, was ich brauche. Liegt aber wahrscheinlich daran, daß ich mich nicht deutlich genug ausgedrückt habe.

Ich möchte im Programm über die Spalten eines mir unbekannten TreeViews iterieren und mir zu jeder Spalte die entsprechende Spalte des zugeordneten Modells (ListStore) zwecks Weiterreichen an die Event-Handler ausgeben lassen. In Glade kann ich ja über die Attribute 'text' und 'model' angeben, aus welchem ListStore und welcher Spalte ich einen Wert beziehen möchte. 'get_property("text")' liefert mir aber im besten Fall nur den Text, der am Ende tatsächlich eingetragen wurde. Meistens sogar gar nichts.

Ich würde gerne ohne eine im Programm hinterlegte Abbildung zwischen den Spaltennummern auskommen. Schließlich habe ich die entsprechende Information ja über Glade schon in der XML-Datei hinterlegt. Und solche Sachen doppelt vorzuhalten ist immer sehr fehleranfällig.
Antworten