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

UnixForum





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

Программирование с использованием gtkmm 3. Раскрывающиеся списки (Combo Boxes)

Оригинал: 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 г.

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

Список оформляется в виде модели представления данных, а столбцы этой модели добавляются в виджет с помощью метода Gtk::ComboBox::pack_start(). Такой подход позволяет достичь гибкости и безопасности использования типов на этапе компиляции, но при этом класс Gtk::ComboBoxText реализует более простой вариант раскрывающегося списка с текстовыми элементами, который может использоваться в том случае, когда гибкость не требуется.

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

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

Модель представления данных раскрывающегося списка может объявляться и заполняться аналогично модели представления данных виджета древовидного представления данных. Например, вы можете создать дочерний класс виджета раскрывающегося списка с одним столбцом для хранения целочисленных значений и одним столбцом для хранения строк следующим образом:
ModelColumns()
{ add(m_col_id); add(m_col_name); }

  Gtk::TreeModelColumn<int> m_col_id;
  Gtk::TreeModelColumn<Glib::ustring> m_col_name;
};

ModelColumns m_columns;

После добавления строк в эту модель вы должны передать ее объекту виджета раскрывающегося списка с помощью метода set_model(). После этого нужно использовать методы pack_start() и pack_end() для указания того, какие столбцы должны быть показаны с помощью виджета раскрывающегося списка. Как и при работе с виджетом древовидного представления данных, вы можете использовать либо стандартные классы для создания объектов прорисовки ячеек путем передачи экземпляра класса Gtk::TreeModelColumn методам упаковки, либо создавать путем наследования специфичные классы для создания на их основе объектов прорисовки ячеек с последующим указанием определенного способа вывода данных с помощью методов add_attribute() или add_cell_data_func(). Учтите, что эти методы реализованы в рамках базового класса Gtk::CellLayout.

10.2. Выбранный элемент

Для установления того, какой элемент раскрывающегося списка выбрал пользователь, если он вообще его выбрал, следует вызывать метод Gtk::ComboBox::get_active(). Этот метод возвращает итератор типа Gtk::TreeModel::iterator, с помощью которого вы можете выявить строку для чтения значений из столбцов модели. Например, вы можете прочитать значение целочисленного идентификатора из модели даже в том случае, если вы решили показывать только понятное пользователю текстовое описание соответствующего элемента с помощью виджета раскрывающегося списка. Примером может служить следующий фрагмент кода:
Gtk::TreeModel::iterator iter = m_Combo.get_active();
if(iter)
{
  Gtk::TreeModel::Row row = *iter;

  //Получение данных для выбранной строки на основании информации
  //об используемой модели представления данных:
  int id = row[m_Columns.m_col_id];
  set_something_id_chosen(id); //Ваша собственная функция.
}
else
  set_nothing_chosen(); //Ваша собственная функция.

10.3. Обработка изменения выбранного элемента

В ходе работы вы можете столкнуться с необходимостью обработки каждого изменения выбранного с помощью раскрывающегося списка элемента, к примеру, для изменения состояния других виджетов. Для этого вы должны обрабатывать сигнал "changed". Например, следующим образом:
m_combo.signal_changed().connect( sigc::mem_fun(*this,
      &ExampleWindow::on_combo_changed) );

10.4. Полнофункциональный пример

Рисунок 10-1: Раскрывающийся список (ComboBox)
Раскрывающийся список (ComboBox)

Исходный код

Файл: examplewindow.h (Для использования совместно с gtkmm 3, а не с gtkmm 2)

Файл: examplewindow.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)

Файл main.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)


Следующий раздел : 10.5. Простой пример с текстовыми элементами списка.