Библиотека сайта 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 для хранения данных
9.1.2. Класс модели TreeStore для хранения иерархических структур
Экземпляр класса Gtk::TreeStore
хранит строки с данными, причем каждая строка может иметь дочерние строки.
Рисунок 9-2: Виджет древовидного представления, использующий класс 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. Представление.