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.
- 10.1.1. ListStore, para filas
- 10.1.2. TreeStore, para una jerarquía
- 10.1.3. Columnas del modelo
- 10.1.4. Añadir filas
- 10.1.5. Configurar los valores
- 10.1.6. Obtener los valores
- 10.1.7. Columnas «ocultas»
10.1.1. ListStore, para filas
El ListStore contiene filas simples de datos, y ninguna fila tiene hijos.
10.1.2. TreeStore, para una jerarquía
El TreeStore contiene filas de datos, y cada fila puede tener filas hijas.
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
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];