El modelo

Cada Gtk::TreeView tiene un Gtk::Model asociado que contiene los datos mostrados por el TreeView Varios Gtk::TreeView puede usar el mismo Gtk::TreeModel. Por ejemplo, esto le permite mostrar y editar los mismos datos de 2 formas diferentes al mismo tiempo. O las 2 vistas pueden mostrar diferentes columnas de los mismos modelos de datos, de la misma manera que dos consultas SQL (o «vistas») pueden mostrar diferentes campos de la misma tabla de la base de datos.

A pesar de que, teóricamente, puede implementar su propio modelo, normalmente usará las clases de los modelos ListStore o TreeStore.

Reference

10.1.1. ListStore, para filas

El ListStore contiene filas simples de datos, y ninguna fila tiene hijos.

Figura 10-1TreeView - ListStore

Reference

10.1.2. TreeStore, para una jerarquía

El TreeStore contiene filas de datos, y cada fila puede tener filas hijas.

Figura 10-2TreeView - TreeStore

Reference

10.1.3. Columnas del modelo

La clase TreeModelColumnRecord se usa para rastrear a las columnas y sus tipos de datos. Añádale instancias TreeModelColumn al ColumnRecord y luego use esas TreeModelColumn cuando establezca u obtenga los datos en las filas del modelo. Probablemente encuentre conveniente derivar un TreeModelColumnRecord que tenga a sus instancias TreeModelColumn como datos miembro.

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;

Especifique el ColumnRecord cuando cree el modelo, así:

Glib::RefPtr<Gtk::ListStore> refListStore =
    Gtk::ListStore::create(m_Columns);

As a TreeModelColumnRecord describes structure, not data, it can be shared among multiple models, and this is preferable for efficiency. However, the instance (such as m_Columns here) should usually not be static, because it often needs to be instantiated after glibmm has been initialized. The best solution is to make it a lazily instantiated singleton, so that it will be constructed on-demand, whenever the first model accesses it.

10.1.4. Añadir filas

Añadir filas al modelo con los métodos append(), prepend(), o insert().

auto iter = m_refListStore->append();

Puede desreferenciar al iterador para obtener la fila:

auto row = *iter;

10.1.4.1. Añadiendo filas secundarias

Los modelos Gtk::TreeStore pueden tener elementos hijos. Añádalos con los métodos append(), prepend(), o insert(), así:

auto iter_child =
    m_refTreeStore->append(row.children());

10.1.5. Configurar los valores

You can use the operator[] overload 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";

10.1.6. Obtener los valores

You can use the operator[] overload to get the data in a particular column in a row, specifying the TreeModelColumn used to create the model.

auto strText = row[m_Columns.m_col_text];
auto number = row[m_Columns.m_col_number];

El compilador le hará saber si usa un tipo inapropiado. Por ejemplo, esto generaría un error de compilación:

//compiler error - no conversion from ustring to int.
int number = row[m_Columns.m_col_text];

10.1.7. Columnas «ocultas»

Puede querer asociar datos adicionales a cada fila. Si es así, sólo añádalos como una columa del modelo, pero no se los añada a la vista.