Gtk::TreeSelection::get_selected_rows, wie komme ich an die Gtk::TreeRow?



  • Ich möchte bei einer TreeView immer informiert werden, wenn eine Zeile markiert wird.
    Dazu benutzt ich signal_columns_changed(). Der Prototyp für dieses Signal hat keine Parameter, deswegen versuch ich über die TreeSelection an die selektierten Zeilen zu kommen. Dort habe ich die Funtkion get_selected_rows. Als Rückgabe gibt's nen ListHandle_Path, was sowas wie ne Liste auf viele Gtk::TreePaths zu sein scheint.
    Doch die Funktion heißt selected_rows, warum krieg ich dann keine Liste auf Gtk::TreeRows? Wie komme ich sonst an die Daten der Row heran? Der Path hat ja keinen []-operator womit ich diese lesen/setzen könnte.



  • Hi,

    die Objekte, die in dem ListHandle_Path-Container gespeichert sind, sind ja nur Gtk::TreePath (bzw. Gtk::TreeModel::Path) Objekte. Mittels dieser Methode kannst du Gtk::TreeModel::Path in Gtk::TreeIter verwandeln. Der gibt dir mehr Handlungsspielraum.

    Ansonsten poste mal ein kleines, kompilierbares Beispiel und ich schau's mir mal an.

    MfG

    GPC



  • Vielen Dank, jetzt klappt's. Beim Erstellen des Minimalbeispiels hab ich diese Seite gefunden: http://gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/ch08s04.html

    Hier mal das funktionierende Minimalbeispiel:

    #include <gtkmm.h>
    #include <iostream>
    
    template<class ColumnType>
    class TreeView
    {
    public:
    	TreeView(Gtk::TreeView& treeView)
    	{
    		treeModel_ = Gtk::ListStore::create(columns_);
    		treeView.set_model(treeModel_);
    		columns_.Init(treeView);
    	}
    	Gtk::TreeRow Append()
    	{
    		return *(treeModel_->append());
    	}
    	ColumnType& Columns()
    	{
    		return columns_;
    	}
    	Glib::RefPtr<Gtk::ListStore> treeModel_;
    private:
    	ColumnType columns_;
    };
    
    struct Columns1 : Gtk::TreeModel::ColumnRecord
    {
    	Columns1()
    	{
    		add(name_);
    		add(hidden_);
    	}
    	void Init(Gtk::TreeView& treeView)
    	{
    		treeView.append_column("Name                        ", name_);
    	}
    	Gtk::TreeModelColumn<Glib::ustring> name_;
    	Gtk::TreeModelColumn<int> hidden_;
    };
    
    void Append(TreeView<Columns1>& treeView, const Glib::ustring& name, int hidden)
    {
    	Gtk::TreeRow row = treeView.Append();
    	row[treeView.Columns().name_] = name;
    	row[treeView.Columns().hidden_] = hidden;
    }
    
    class Window : public Gtk::Window
    {
    public:
    	Window() : treeView_(gtkTreeView_)
    	{
    		gtkTreeView_.get_selection()->set_mode(Gtk::SELECTION_MULTIPLE);
    		gtkTreeView_.get_selection()->set_select_function(sigc::mem_fun(*this, &Window::SelectFunction));
    		add(gtkTreeView_);
    		Append(treeView_, "Eins", 1);
    		Append(treeView_, "Zwei", 2);
    		Append(treeView_, "Drei", 3);
    		Append(treeView_, "Vier", 4);
    		show_all();
    	}
    private:
    	Gtk::TreeView gtkTreeView_;
    	TreeView<Columns1> treeView_;
    	bool SelectFunction(const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool pathCurrentlySelected)
    	{
    		const Gtk::TreeModel::iterator iter = model->get_iter(path);
    		Gtk::TreeRow row = *iter;
    		if(!pathCurrentlySelected)
    			std::cout << "selected: ";
    		else
    			std::cout << "unselected: ";
    		std::cout << row[treeView_.Columns().hidden_] << std::endl;
    		return iter->children().empty();
    	}
    };
    
    int main(int argc, char** argv)
    {
    	Gtk::Main kit(argc, argv);
    	Window win;
    	kit.run(win);
    }
    

    Das einzige was ich noch nicht verstehe ist:

    return iter->children().empty(); // only allow leaf nodes to be selected
    

    Was bedeutet das?



  • joomoo schrieb:

    Das einzige was ich noch nicht verstehe ist:

    return iter->children().empty(); // only allow leaf nodes to be selected
    

    Was bedeutet das?

    Gute Frage^^
    Es scheint so, als würde es auf eventuelle Kinder/Rows des betreffenden Iterators (also TreeNode) prüfen.


Anmelden zum Antworten