c++ - Why is the information displayed twice in TreeView when using CellRenderer in gtkmm -
having following code:
mytreeview::mytreeview(gtktreeview* cobject, const glib::refptr<gtk::builder>& builder) : gtk::treeview(cobject) { glib::refptr< gtk::treestore > treemodel; treemodel = gtk::treestore::create(treecolumns); this->set_model(treemodel); gtk::treemodel::row row = *(treemodel->append()); row[treecolumns.id] = 1; row[treecolumns.name] = "one"; gtk::treemodel::row childrow = *(treemodel->append(row.children())); childrow[treecolumns.id] = 11; childrow[treecolumns.name] = "eleven"; childrow = *(treemodel->append(row.children())); childrow[treecolumns.id] = 12; childrow[treecolumns.name] = "twelve"; row = *(treemodel->append()); row[treecolumns.id] = 2; row[treecolumns.name] = "two"; row = *(treemodel->append()); row[treecolumns.id] = 3; row[treecolumns.name] = "three"; childrow = *(treemodel->append(row.children())); childrow[treecolumns.id] = 31; childrow[treecolumns.name] = "thirtyone"; gtk::treemodel::row subchild = *(treemodel->append(childrow.children())); subchild[treecolumns.id] = 311; subchild[treecolumns.name] = "three hundred eleven"; gtk::treeviewcolumn *view_column = gtk::manage(new gtk::treeviewcolumn("name", treecolumns.name)); gtk::cellrenderertext *cellrenderer = gtk::manage(new gtk::cellrenderertext()); view_column->pack_start(*cellrenderer, false); view_column->set_cell_data_func(*cellrenderer, sigc::mem_fun(*this, &mytreeview::on_cell_data_name)); this->append_column(*view_column); } void mytreeview::on_cell_data_name(gtk::cellrenderer* renderer, const gtk::treemodel::iterator& iter) { //get value model , show appropriately in view: gtk::treemodel::row row = *iter; int id = row[treecolumns.id]; glib::ustring name = row[treecolumns.name]; gtk::cellrenderertext* text_renderer = dynamic_cast<gtk::cellrenderertext*>(renderer); if (id == 11) { text_renderer->property_weight().set_value(pango::weight::weight_heavy); } else { text_renderer->property_weight().set_value(pango::weight::weight_normal); } if(text_renderer) { text_renderer->property_text() = name; } } i have following:

so data duplicated in sort of subcolumn or somesuch. why happen? can have rendered text (with correct font).
i have managed make example without using glade, problem still there:
treeview.cpp:
#include <gtkmm.h> #include "mywindow.hpp" int main(int argc, char *argv[]) { glib::refptr<gtk::application> app = gtk::application::create(argc, argv, "org.spike.treeview"); mywindow window; app->run(window); return 0; } mywindow.hpp:
#include <gtkmm.h> #include "mytreeview.hpp" class mywindow : public gtk::applicationwindow { public: mywindow(); virtual ~mywindow(); protected: mytreeview *treeview; }; mytreeview.hpp:
#include <gtkmm.h> class mytreeview : public gtk::treeview { public: mytreeview(); void on_cell_data_name(gtk::cellrenderer* renderer, const gtk::treemodel::iterator& iter); class modelcolumns : public gtk::treemodel::columnrecord { public: modelcolumns() { add(id); add(name); add(type); add(publickey); add(privatekey); } gtk::treemodelcolumn<int> id; gtk::treemodelcolumn<glib::ustring> name; gtk::treemodelcolumn<char> type; gtk::treemodelcolumn<glib::ustring> publickey; gtk::treemodelcolumn<glib::ustring> privatekey; } treecolumns; }; mywindow.cpp:
#include <iostream> #include "mywindow.hpp" mywindow::mywindow() { treeview = gtk::manage(new mytreeview()); add(*treeview); show_all_children(); } mywindow::~mywindow() {} mytreeview.cpp:
#include <iostream> #include "mytreeview.hpp" mytreeview::mytreeview() { glib::refptr< gtk::treestore > treemodel; treemodel = gtk::treestore::create(treecolumns); this->set_model(treemodel); gtk::treemodel::row row = *(treemodel->append()); row[treecolumns.id] = 1; row[treecolumns.name] = "one"; gtk::treemodel::row childrow = *(treemodel->append(row.children())); childrow[treecolumns.id] = 11; childrow[treecolumns.name] = "eleven"; childrow = *(treemodel->append(row.children())); childrow[treecolumns.id] = 12; childrow[treecolumns.name] = "twelve"; row = *(treemodel->append()); row[treecolumns.id] = 2; row[treecolumns.name] = "two"; row = *(treemodel->append()); row[treecolumns.id] = 3; row[treecolumns.name] = "three"; childrow = *(treemodel->append(row.children())); childrow[treecolumns.id] = 31; childrow[treecolumns.name] = "thirtyone"; gtk::treemodel::row subchild = *(treemodel->append(childrow.children())); subchild[treecolumns.id] = 311; subchild[treecolumns.name] = "three hundred eleven"; // this->append_column_editable("name (orig)", treecolumns.name); // this->append_column("id", treecolumns.id); gtk::treeviewcolumn *view_column = gtk::manage(new gtk::treeviewcolumn("name", treecolumns.name)); gtk::cellrenderertext *cellrenderer = gtk::manage(new gtk::cellrenderertext()); view_column->pack_start(*cellrenderer, false); view_column->set_cell_data_func(*cellrenderer, sigc::mem_fun(*this, &mytreeview::on_cell_data_name)); this->append_column(*view_column); } void mytreeview::on_cell_data_name(gtk::cellrenderer* renderer, const gtk::treemodel::iterator& iter) { //get value model , show appropriately in view: gtk::treemodel::row row = *iter; int id = row[treecolumns.id]; glib::ustring name = row[treecolumns.name]; gtk::cellrenderertext* text_renderer = dynamic_cast<gtk::cellrenderertext*>(renderer); if (id == 11) { text_renderer->property_weight().set_value(pango::weight::weight_heavy); } else { text_renderer->property_weight().set_value(pango::weight::weight_normal); } if(text_renderer) { text_renderer->property_text() = name; } }
because of line:
gtk::treeviewcolumn *view_column = gtk::manage(new gtk::treeviewcolumn("name", treecolumns.name)); you've specified treemodel column instead of title, has added default cell renderer default renderering of data in column. need instead:
gtk::treeviewcolumn *view_column = gtk::manage(new gtk::treeviewcolumn("name"));
Comments
Post a Comment