Программирование с gtkmm (Главы 8-9)

Translate into another language.

8. Виджет TreeView

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

*8.1. Модель

*8.2. Вид

*8.3. Итерации по рядам модели

* 8.4. Выделение

* 8.5. Сортировка

*8.6.Перетаскивание

* 8.7. Контекстное меню

* 8.8.Примеры

8.1. Модель

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

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

Справочный материал

* 8.1.1. ListStore, для рядов

* 8.1.2. TreeStore, для иерархии

* 8.1.3. Столбцы модели

* 8.1.4. Добавление рядов

* 8.1.5. Установка значений

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

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

* 8.1.1. ListStore, для рядов

ListStore содержит простые ряды данных, у которых нет дочерних рядов.

Рисунок 8-1. TreeView - ListStore

Справочный материал

* 8.1.2. TreeStore, для иерархии

TreeStore содержит ряды данных, у каждого из которых могут быть дочерние ряды.

Рисунок 8-2. TreeView - TreeStore

Справочный материал

8.1.3. Столбцы модели

Класс TreeModelColumnRecord ("записи в столбцах модели дерева данных") используется для отслеживания столбцов и типов данных в них. Вы добавляете объекты класса TreeModelColumn ("столбец модели дерева данных") в ColumnRecord ("запись в столбце"), а затем используете эти объекты TreeModelColumn при получении и установке значений данных в рядах модели. Вы можете счесть удобным наследовать новую TreeModelColumnRecord с вашими объектами 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;

Вы указываете эту ColumnRecord при создании Модели, например так:

Glib::RefPtr<Gtk::ListStore>
refListStore =

Gtk::ListStore::create(m_Columns);

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

8.1.4. Добавление рядов

Добавляйте ряды в модель с помощью методов append(), prepend() или insert().

Gtk::TreeModel::iterator iter = m_refListStore->append();

Вы можете разыменовать этот итератор для получения Ряда:

Gtk::TreeModel::Row row = *iter;

* 8.1.4.1. Добавление дочерних рядов

8.1.4.1. Добавление дочерних рядов

Модели Gtk::TreeStore могут содержать дочерние объекты. Добавляйте их с помощью методов append(), prepend() или insert(), например так:

Gtk::TreeModel::iterator iter_child =

m_refListStore->append(row.children());

8.1.5. Установка значений

Вы можете воспользоваться перегруженным оператором "[]" для установки данных в конкретного столбца в строке, указав, используемую для построения модели, TreeModelColumn

row[m_Columns.m_col_text] = "какой-то текст";

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

Вы можете воспользоваться перегруженным оператором "[]" для получения данных из конкретного столбца в строке, указав, используемую для построения модели, 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];

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

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

8.2. Вид

Вид - это виджет (Gtk::TreeView), который отображает данные модели (Gtk::TreeModel) и даёт возможность пользователю взаимодействовать с ними. Вид может отображать все столбцы модели, или же только некоторые, причём различным путями.

Справочный материал

* 8.2.1. Применение Модели

* 8.2.2. Добавление столбцов Вида

* 8.2.3. Больше одного столбца Модели на столбец Вида

* 8.2.4. Указание деталей CellRenderer (обработчик ячеек)

* 8.2.5. Редактируемые ячейки

8.2.1. Применение Модели

Вы можете указать Gtk::TreeModel во время конструирования объекта Gtk::TreeView, или вы можете использовать метод set_model, например так:

m_TreeView.set_model(m_refListStore);

8.2.2. Добавление столбцов Вида

Вы можете использовать метод append_column(), чтобы указать Виду, что он должен отображать определённые столбцы Модели, в определённом порядке, с определённым заголовком.

m_TreeView.append_column("Сообщения", m_Columns.m_col_text)
;

При использовании этой простой append_column() переопределения TreeView будет отображать модели данных с соответствующей CellRenderer. Например, строки и числа представлены в простом виджете Gtk::Entry, и логические операции приведены в Gtk::CheckButton. Как правило, это то, что вам нужно. Для других типов столбцов, необходимо либо подключить обратный вызов, который преобразует тип в строковое представление, с TreeViewColumn:: set_cell_data_func (), или получить пользовательский CellRenderer. Заметим, что (unsigned) short не поддерживается по умолчанию - вы можете использовать (unsigned) Int или (unsigned) long колонного типа вместо этого.

8.2.3. Больше одного столбца Модели на столбец Вида

Для оказания более чем одной модели столбца в представлении колонки, вам нужно создать TreeView:: Column вручную, а также использовать pack_start() для добавления модели столбцов к нему.

Затем используйте append_column() для добавления столбца. Обратите внимание, что Gtk:: View:: append_column () переопределяется, чтобы принять или готовые Gtk:: View::Column или просто TreeModelColumn, из которой она генерирует соответствующие Gtk::View::Column.

Вот несколько примеров кода из demos/gtk-demo/example_stockbrowser.cc, где значок и текст, название в том же столбце:

Gtk::TreeView::Column* pColumn =

Gtk::manage( new Gtk::TreeView::Column("Символ") );

// m_columns.icon и m_columns.symbol - это столбцы модели.

// pColumn - это столбец в TreeView:

pColumn->pack_start(m_columns.icon, false); //false = не разворачивать.

pColumn->pack_start(m_columns.symbol);

m_TreeView.append_column(*pColumn);

8.2.4. Указание деталей CellRenderer (обработчик ячеек)

Поведение по умолчанию CellRenderers как правило хватает но вы можете управлять им по своему. Например, этот пример кода из demos/gtk-demo/example_treestore.cc.

Gtk::CellRendererToggle* pRenderer =

Gtk::manage( new Gtk::CellRendererToggle() );

int cols_count = m_TreeView.append_column("Alex", *pRenderer);

Gtk::TreeViewColumn* pColumn = m_TreeView.get_column(cols_count-1);

if(pColumn)

{

Pages: ← previous Ctrl next
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

© Copyright © 2002-2006 Murray Cumming

Original (English): Programming with gtkmm (chapters 8-9)

Translation: © Knivy, yaskhan, eReS, Prizrak, netrino, space_indus, lynx .

License: GNU FDL

translated.by crowd

Like this translation? Share it or bookmark!