Программирование с gtkmm (Главы 8-9) |
- Statistics
- Participants
- Translate into Russian
- Translation result
- 99% translated in draft. Almost done, let's finish it!
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)
{
© 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
