Библиотека сайта 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
Перевод: А.Панин
10.5. Простой пример с текстовыми элементами списка
Рисунок 10-2: Раскрывающийся список с текстовыми элементами (ComboBoxText)
Файл: examplewindow.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: examplewindow.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
10.6. Раскрывающийся список с полем ввода строки
Виджет раскрывающегося списка может содержать виджет ввода строки, предназначенный для ввода произвольного текста в том случае, если вы использовали логическое значение true
в качестве значения параметра has_entry
конструктора виджета.
10.6.1. Текстовый столбец модели
set_entry_text_column()
. К примеру, это может сделано следующим образом:
m_combo.set_entry_text_column(m_columns.m_col_name);
После этого в момент выбора варианта из раскрывающегося списка текстовое значение из установленного столбца будет размещаться в поле ввода строки.
10.6.2. Поле ввода строки
Так как пользователь имеет возможность ввода произвольного текста, активной строки модели не достаточно для того, чтобы выяснить, какой текст ввел пользователь. Следовательно, вы должны получить объект виджета ввода строки с помощью метода Gtk::ComboBox::get_entry()
и использовать метод get_text()
полученного объекта.
10.6.3. Обработка изменений
"changed"
, который генерируется при вводе пользователем каждого из символов, может оказаться недостаточной. При этом он не генерируется в тот момент, когда пользователь нажимает клавишу Enter. Нажатие на клавишу Enter или перемещение фокуса ввода на другой виджет может указывать на то, что пользователь закончил ввод текста. Для получения уведомлений о наступлении этих событий следует устанавливать обработчики сигналов "activate"
и "focus_out_event"
виджета ввода строки следующим образом:
Gtk::Entry* entry = m_Combo.get_entry(); if (entry) { // Виджет ввода строки должен получать уведомления о наступлении событий перемещения фокуса ввода. entry->add_events(Gdk::FOCUS_CHANGE_MASK); // Альтернативным вариантом является установка обработчика m_Combo.signal_changed(). entry->signal_changed().connect(sigc::mem_fun(*this, &ExampleWindow::on_entry_changed) ); entry->signal_activate().connect(sigc::mem_fun(*this, &ExampleWindow::on_entry_activate) ); entry->signal_focus_out_event().connect(sigc::mem_fun(*this, &ExampleWindow::on_entry_focus_out_event) ); }
Сигналы "changed"
как виджета раскрывающегося списка, так и виджета ввода строки генерируются при каждом изменении. Не имеет значения, для какого из сигналов вы установили обработчик. При этом в данном случае работоспособный обработчик сигнала "focus_out_event"
может устанавливаться только для виджета ввода строки.
События оконной системы X описываются в подробностях в разделе приложения под названием "Сигналы для событий оконной системы X".
10.6.4. Полнофункциональный пример использования списка с полем ввода строки
Рисунок 10-3: Раскрывающийся список с полем ввода строки
Файл: examplewindow.h
(Для работы совместно с gtkmm 3, а не с gtkmm 2)
Файл: examplewindow.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
10.6.5. Простой пример использования списка с текстовыми элементами и полем ввода строки
Рисунок 10-4: Раскрывающийся список с текстовыми элементами и полем ввода строки
Файл: examplewindow.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: examplewindow.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Следующий раздел : Поле ввода текста (TextView).