Table of Contents
The Gtk::TreeView widget can contain lists or trees of
data, in columns.
Each Gtk::TreeView has an associated
Gtk::TreeModel, which contains the data displayed by the
TreeView. Each Gtk::TreeModel can
be used by more than one Gtk::TreeView. For instance,
this allows the same underlying data to be displayed and edited in 2 different
ways at the same time. Or the 2 Views might display different columns from the
same Model data, in the same way that 2 SQL queries (or "views") might
show different fields from the same database table.
Although you can theoretically implement your own Model, you will normally use
either the ListStore or TreeStore
model classes.
The ListStore contains simple rows of data, and each row
has no children.
The TreeStore contains rows of data, and each row may
have child rows.
The TreeModelColumnRecord class is used to keep track
of the columns and their data types. You add
TreeModelColumn instances to the
ColumnRecord and then use those
TreeModelColumns when getting and setting the data in
model rows. You will probably find it convenient to derive a new
TreeModelColumnRecord which has your
TreeModelColumn instances as member data.
class ModelColumns : public Gtk::TreeModelColumnRecord
{
public:
ModelColumns()
{ add(m_col_text); add(m_col_number); }
Gtk::TreeModelColumn<Glib::ustring> m_col_text;
Gtk::TreeModelColumn<int> m_col_number;
};
ModelColumns m_Columns;
You specify the ColumnRecord when creating the Model,
like so:
Glib::RefPtr<Gtk::ListStore> refListStore =
Gtk::ListStore::create(m_Columns);
Note that the instance (such as m_Columns here) should usually not be static, because it often needs to be instantiated after glibmm has been instantiated.
Add rows to the model with the append(),
prepend(), or insert() methods.
Gtk::TreeModel::iterator iter = m_refListStore->append();
You can dereference the iterator to get the Row:
Gtk::TreeModel::Row row = *iter;
You can use the operator[] override to set the data for a
particular column in the row, specifying the
TreeModelColumn used to create the model.
row[m_Columns.m_col_text] = "sometext";
You can use the operator[] override to get the data in a
particular column in a row, specifiying the
TreeModelColumn used to create the model.
Glib::ustring strText = row[m_Columns.m_col_text]; int number = row[m_Columns.m_col_number];
The compiler will complain if you use an inappropriate type. For instance, this would generate a compiler error:
//compiler error - no conversion from ustring to int. int number = row[m_Columns.m_col_text];