Библиотека сайта 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)
Файл: examplewindow.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: examplewindow.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Следующий раздел : 10.5. Простой пример с текстовыми элементами списка.