La vista

La vista es el widget en sí (Gtk::TreeView) que muestra los datos del modelo (Gtk::TreeModel) y le permite al usuario interactuar con él. La vista puede mostrar todas las columnas del modelo, o sólo algunas, y puede mostrarlas de varias maneras.

Referencia

10.2.1. Usar un modelo

Puede especificar un Gtk::TreeModel cuando construye la Gtk::TreeView, o puede usar el método set_model(), así:

m_TreeView.set_model(m_refListStore);

10.2.2. Añadir columnas a la vista

Puede usar el método append_column() para decirle a la vista que debe mostrar ciertas columnas del modelo, en cierto orden, con un cierto título de columna.

m_TreeView.append_column("Messages", m_Columns.m_col_text);

When using this simple append_column() overload, the TreeView will display the model data with an appropriate CellRenderer. For instance, strings and numbers are shown in a simple Gtk::Entry widget, and booleans are shown in a Gtk::CheckButton. This is usually what you need. For other column types you must either connect a callback that converts your type into a string representation, with TreeViewColumn::set_cell_data_func(), or derive a custom CellRenderer. Note that (unsigned) short is not supported by default - You could use (unsigned) int or (unsigned) long as the column type instead.

10.2.3. Más de una columna del modelo por columna de la vista

Para reproducir más de una columna del modelo en una columna de vista, necesita crear el widget TreeView::Column manualmente, y usar pack_start() para añadirle las columnas del modelo.

Then use append_column() to add the view Column to the View. Notice that Gtk::TreeView::append_column() is overloaded to accept either a prebuilt Gtk::TreeView::Column widget, or just the TreeModelColumn from which it generates an appropriate Gtk::TreeView::Column widget.

Here is some example code, which has a pixbuf icon and a text name in the same column:

auto pColumn = Gtk::make_managed<Gtk::TreeView::Column>("Icon Name");

// m_columns.icon and m_columns.iconname are columns in the model.
// pColumn is the column in the TreeView:
pColumn->pack_start(m_columns.icon, /* expand= */ false);
pColumn->pack_start(m_columns.iconname);

m_TreeView.append_column(*pColumn);

10.2.4. Especificar los detalles del CellRenderer

The default CellRenderers and their default behaviour will normally suffice, but you might occasionally need finer control. For instance, this example code from gtkmm/demos/gtk-demo/example_treeview_treestore.cc, appends a Gtk::CellRenderer widget and instructs it to render the data from various model columns through various aspects of its appearance.

auto cols_count = m_TreeView.append_column_editable("Alex", m_columns.alex);
auto pColumn = m_TreeView.get_column(cols_count-1);
if(pColumn)
{
  auto pRenderer = static_cast<Gtk::CellRendererToggle*>(pColumn->get_first_cell());
  pColumn->add_attribute(pRenderer->property_visible(), m_columns.visible);
  pColumn->add_attribute(pRenderer->property_activatable(), m_columns.world);

También puede conectarle señales a un CellRenderer para detectar las acciones del usuario. Por ejemplo:

auto pRenderer = Gtk::make_managed<Gtk::CellRendererToggle>();
pRenderer->signal_toggled().connect(
    sigc::bind( sigc::mem_fun(*this,
        &Example_TreeView_TreeStore::on_cell_toggled), m_columns.dave)
);

10.2.5. Celdas editables

10.2.5.1. Celdas editables guardadas automáticamente.

Cells in a TreeView can be edited in-place by the user. To allow this, use the Gtk::TreeView insert_column_editable() and append_column_editable() methods instead of insert_column() and append_column(). When these cells are edited the new values will be stored immediately in the Model. Note that these methods are templates which can only be instantiated for simple column types such as Glib::ustring, int, and long.

10.2.5.2. Implementación de la lógica personalizada para celdas editables.

Sin embargo, tal vez no quiera que se almacenen los valores nuevos inmediatamente. Por ejemplo, tal vez quiera restringir la entrada a ciertos caracteres o rangos de valores.

To achieve this, you should use the normal Gtk::TreeView insert_column() and append_column() methods, then use get_column_cell_renderer() to get the Gtk::CellRenderer used by that column.

Entonces, convierta ese Gtk::CellRenderer* al CellRenderer específico que espera, para que pueda usar la API específica.

Por ejemplo, para un CellRendererText, establecería la propiedad editable de la celda a «true», así:

cell->property_editable() = true;

Para un CellRendererToggle, establecería la propiedad activable en su lugar.

You can then connect to the appropriate "edited" signal. For instance, connect to Gtk::CellRendererText::signal_edited(), or Gtk::CellRendererToggle::signal_toggled(). If the column contains more than one CellRenderer then you will need to use Gtk::TreeView::get_column() and then call get_cells() on that view Column.

En su gestor de señales, debe examinar el valor nuevo y luego almacenarlo en el modelo, si eso es lo apropiado para su aplicación.