[GTKmm] Objecte an ein TreeView-Eintrag haengen.



  • Ich habe folgende Funktion, um einige Classen, die ich in meinem Projekt habe, in einem Gtk::Treeview darzustellen:

    void Table::add_item(const Cellitem& cellitem) const
    {
    	Gtk::TreeModel::Row row = *(this->glib_refptr_treestore->append());
    	row[this->cellmodel.gtk_treemodelcolumn_ustring] = cellitem.glib_ustring_label;
    
    	this->add_sub_item(&row, cellitem);
    };
    
    void Table::add_sub_item(const Gtk::TreeModel::Row* row, const Cellitem& cellitem) const
    {
    	for (std::vector<Cellitem>::const_iterator it = cellitem.std_vector_children.begin();
    			it != cellitem.std_vector_children.end();
    			it++)
    	{
    		const Cellitem cellitem_child = *it;
    		Gtk::TreeModel::Row row_child = *(this->glib_refptr_treestore->append(row->children()));
            row_child[this->cellmodel.gtk_treemodelcolumn_ustring] = cellitem_child.glib_ustring_label;
    
            this->add_sub_item(&row_child, cellitem_child);
    	}
    };
    

    Nun verwende ich das Signal signal_row_activated um an den Eintrag zu kommen, der gerade ausgewaehlt wurde.
    Mein Problem liegt jetzt darin, dass ich an das Objekt gelangen will, das ich an das Objekt gelangen will, fuer den die Eintraege im Treeview stehen. Und zwar solten die irgendwie zwischengespeichert werden.

    Ich haette dabei 2 Vorschlaege:

    1. Erstelle eine Unterklasse von Gtk::TreeModel::Row bzw. Gtk::TreeModel::Path und fuege dort ein Feld fuer das Objekt ein.
    Das wird aber irgendwie nicht gehn, weil das Gtk::TreeModel::Row durch this->glib_refptr_treestore->append(row->children()) u.a. erstellt wird.

    Ich muesste also auch ne Unterklasse fuer Gtk::Treestore erstellen.

    Find ich irgendwie zu kompliziert.

    2. Der zweite Vorschlag waere, ich erstelle eine Map in der Klasse, der jeweils Pfad und Objekt in Verbindung setzt.
    Dies ist sicher schnell implementiert, setzt aber dann auch immer voraus dass in allen Methoden, die den Treeview als Argument haben, diese Map beruecksichtigen muessen.

    Hat jemand vielleicht einen besseren Vorschlag bzw. kennt sich besser mit GTKmm aus und weiss dort einen besseren Weg?

    mfg
    moe



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Normalerweise hatte ich auch immer eine Zuordnung mittels std::map programmiert, allerdings weiß ich nicht mehr genau wie, da das schon etwas her ist. Ich werd heute Abend noch mal danach schauen.



  • Jo, nachgeschaut. Mit std::map eine Verbindung zwischen id des Tree-Elements und dem eigentlichen Objekt mit den Daten dahinter hergestellt.

    Als dritte Alternative könntest du auch der logischen Schicht die Organisation der Daten überlassen, das kann man schön auslagern, ist aber etwas aufwändiger zum Programmieren, weil man ja Sachen wie suchen usw. bauen muss.

    Alles in allem fährt man imo mit std::map am Besten.



  • Thx an GPC, also werd ich wohl die Map nehmen.

    So auf die schnelle wuerde ich:

    std::map<Gtk::TreeModel::Row*, Cellitem> map;
    

    nahmen, oder was meinst du dazu?

    mfg



  • Na ja, geht auch anders.
    Meistens sieht ein Eintrag im Baum ja so aus:

    class ModelColumns : public Gtk::TreeModelColumnRecord
    {
    public:
    
      ModelColumns()
        { add(m_col_text); add(m_col_number); }
    
      Gtk::TreeModelColumn<Glib::ustring> col_text;
      Gtk::TreeModelColumn<int> id;
      //usw....
    };
    

    Du könntest also entweder direkt auf die id gehen, einen iterator darauf ablegen oder eben so, wie du's gemacht hast. Das kommt halt drauf an, was dir für deinen Zweck besser erscheint. Das nimmt sich alles nicht viel.


Anmelden zum Antworten