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

UnixForum





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

Программирование с использованием gtkmm 3. Виджеты без окон оконной системы X

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

Некоторые виджеты не имеют ассоциированного окна оконной системы X, поэтому они не получают уведомления о событиях оконной системы X. Это значит, что сигналы, описанные в главе "Сигналы, соответствующие событиям оконной системы X", не будут генерироваться. Если вы хотите обрабатывать описанные события при работе с такими виджетами, вы можете использовать специальный контейнер, представленный классом Gtk::EventBox и описанный в разделе "Контейнер приема событий (EventBox)".

Ниже приведен список классов, лежащих в основе некоторых из таких виджетов:
Gtk::Alignment
Gtk::Arrow
Gtk::AspectFrame
Gtk::Bin
Gtk::Box
Gtk::Button
Gtk::CheckButton
Gtk::Fixed
Gtk::Frame
Gtk::Grid
Gtk::Image
Gtk::Label
Gtk::MenuItem
Gtk::Notebook
Gtk::Paned
Gtk::RadioButton
Gtk::Range
Gtk::ScrolledWindow
Gtk::Separator
Gtk::Table (является устаревшим начиная с версии 3.4 gtkmm)
Gtk::Toolbar

Эти виджеты главным образом используются в декоративных целях или для вывода информации, поэтому вам обычно не потребуется перехватывать события при работе с ними. Окна оконной системы X умышленно не используются для реализации этих виджетов с целью повышения производительности.

15.1. Контейнер приема событий (EventBox)

Некоторые виджеты из состава gtkmm не имеют ассоциированных окон оконной системы X; они используют окна родительских виджетов для прорисовки. Ввиду этого они не могут принимать уведомления о наступлении событий. Также в том случае, если размер окна верхнего уровня слишком мал, размер таких виджетов не будет корректно уменьшаться, поэтому вы можете наблюдать беспорядочные наложения одних виджетов на другие и.т.д. Для приема уведомлений о событиях с помощью одного из таких виджетов вы можете разместить этот виджет в контейнере приема событий (EventBox) с последующим вызовом метода Gtk::Widget::set_events() по отношению к контейнеру приема событий перед его показом.

Хотя название контейнера EventBox и предполагает использование методики разработки с управлением событиями, этот контейнер также может быть использован для корректного сокращения размера виджета (и для других целей, о которых будет сказано в примере ниже).

Конструктор класса Gtk::EventBox выглядит следующим образом:
Gtk::EventBox();
Дочерний виджет может быть добавлен в контейнер приема событий с помощью метода:
event_box.add(child_widget);

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

15.1.1. Пример

Следующий пример демонстрирует оба варианта использования контейнера приема событий - виджет вывода строки создается таким образом, чтобы была возможность корректного изменения его размеров при размещении в небольшой области, а также при нажатии кнопки мыши с указателем над данным виджетом программа завершает свою работу. Изменение размеров окна приводит к показу невидимых частей виджета вывода строки.

Рисунок 15-1: Контейнер приема событий (EventBox)
Контейнер приема событий (EventBox)

Исходный код

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

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

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


Следующий раздел : Диалоги.