Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Программирование с использованием gtkmm 3. Виджет древовидного представления данных (TreeView)

Оригинал: Programming with gtkmm 3
Авторы: Murray Cumming, Bernhard Rieder, Jonathon Jongsma, Ole Laursen, Marko Anastasov, Daniel Elstner, Chris Vine, David King, Pedro Ferreira, Kjell Ahlstedt
Дата публикации: 15 Октября 2013 г.
Перевод: А.Панин
Дата перевода: 15 марта 2014 г.

Виджет древовидного представления данных, реализованный в рамках класса Gtk::TreeView, позволяет создавать плоское или древовидное представление данных с использованием столбцов.

9.1. Модель представления данных

Каждый виджет древовидного представления данных, реализованный в рамках класса Gtk::TreeView, имеет ассоциированный экземпляр класса Gtk::TreeModel, который непосредственно содержит данные, отображаемые этим виджетом древовидного представления данных. Каждый объект модели представления данных может использоваться более чем одним виджетом древовидного представления данных. К примеру, это позволяет отображать и редактировать одни и те же данные двумя разными способами одновременно. Или же два виджета древовидного представления данных могут выводить различные столбцы из одной и той же модели таким же образом, как и два SQL-запроса (или "представления") могут извлекать данные из различных столбцов одной и той же таблицы базы данных.

Хотя в теории вы и можете реализовать собственную модель представления данных, в нормальных условиях вы скорее всего будете использовать классы моделей Gtk::ListStore и Gtk::TreeStore.

Справочная информация

9.1.1. Класс модели ListStore для хранения списков

Экземпляр класса Gtk::ListStore хранит простые строки с данными, причем каждая строка не имеет дочерних строк.

Рисунок 9-1: Виджет древовидного представления, использующий класс Gtk::ListStore для хранения данных
Виджет древовидного представления, использующий класс Gtk::ListStore для хранения данных

Справочная информация

9.1.2. Класс модели TreeStore для хранения иерархических структур

Экземпляр класса Gtk::TreeStore хранит строки с данными, причем каждая строка может иметь дочерние строки.

Рисунок 9-2: Виджет древовидного представления, использующий класс Gtk::TreeStore для хранения данных
Виджет древовидного представления, использующий класс Gtk::TreeStore для хранения данных

Справочная информация

9.1.3. Столбцы модели представления данных

Класс Gtk::TreeModelColumnRecord используется для работы со столбцами модели и их типами данных. Вы можете передавать экземпляры класса Gtk::TreeModelColumn экземпляру класса Gtk::ColumnRecord, после чего использовать эти экземпляры классов Gtk::TreeModelColumn при получении и изменении данных в строках модели. Возможно, вам покажется удобным вариант наследования нового класса от класса Gtk::TreeModelColumnRecord, в котором экземпляры классов Gtk::TreeModelColumn будут вспомогательными.
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;
При этом вы должны указывать на экземпляр класса Gtk::TreeModelColumnRecord при создании модели таким образом, как показано ниже:
Glib::RefPtr<Gtk::ListStore> refListStore =
    Gtk::ListStore::create(m_Columns);

Учтите, что экземпляр класса (такой, как m_Columns выше) обычно не должен быть статическим, так как обычно он должен создаваться после создания экземпляров классов glibmm.

9.1.4. Добавление строк

Строки добавляются в модель представления данных с помощью методов append(), prepend() и insert().
Gtk::TreeModel::iterator iter = m_refListStore->append();
При этом вы можете разыменовывать итератор для получения объекта строки:
Gtk::TreeModel::Row row = *iter;

9.1.4.1. Добавление дочерних строк

Модели, являющиеся экземплярами класса Gtk::TreeStore, могут иметь дочерние элементы. Вы можете добавлять их с помощью методов append(), prepend() и insert() таким же образом, как показано ниже:
Gtk::TreeModel::iterator iter_child =
    m_refListStore->append(row.children());

9.1.5. Присваивание значений

Вы можете использовать перегруженный оператор [] для для присваивания значения элементу из определенного столбца в строке, указав экземпляр класса Gtk::TreeModelColumn, использованный для создания модели:
row[m_Columns.m_col_text] = "sometext";

9.1.6. Получение значений

Вы можете использовать перегруженный оператор [] для получения данных элемента из определенного столбца в строке, указав экземпляр класса Gtk::TreeModelColumn, использованный для создания модели.
Glib::ustring strText = row[m_Columns.m_col_text];
int number = row[m_Columns.m_col_number];
Компилятор сообщит об использовании неподходящего типа данных в случае возникновения подобной ошибки. К примеру, данный вызов должен привести к генерации ошибки компилятора:
//ошибка компилятора - нет преобразования типа ustring к типу int.
int number = row[m_Columns.m_col_text];

9.1.7. "Скрытые" столбцы

Вам может потребоваться ассоциация дополнительных данных с каждой из строк. В таком случае просто добавьте их в качестве столбца модели, но не добавляйте их при работе с виджетом древовидного представления данных.


Следующий раздел : 9.2. Представление.