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.