Библиотека сайта rus-linux.net
Программирование с использованием gtkmm 3. Контейнерные виджеты
Оригинал: Programming with gtkmm 3
Авторы: Murray Cumming, Bernhard Rieder, Jonathon Jongsma, Ole Laursen, Marko Anastasov, Daniel Elstner, Chris Vine, David King, Pedro Ferreira, Kjell Ahlstedt
Перевод: А.Панин
8. Контейнерные виджеты
Все классы контейнерных виджетов наследуются от класса Gtk::Container
, причем не всегда напрямую. Некоторые контейнерные виджеты, такие, как виджет, представленный классом Gtk::Grid
, могут содержать множество дочерних виджетов, поэтому их классы обычно имеют более сложные интерфейсы. Другие, такие, как представленные классом Gtk::Frame
, могут содержать только один виджет.
8.1. Контейнеры для одного виджета
Классы контейнерных виджетов, содержащих только один виджет, наследуются от класса Gtk::Bin
, который предоставляет методы add()
и remove()
в распоряжение классов дочерних виджетов. Учтите, что представленные классами Gtk::Button
и Gtk::Window
виджеты технически также являются контейнерами для единственного виджета, но мы уже успели обсудить их ранее.
Мы также обсудим представленный классом Gtk::Paned
виджет, который позволяет вам разделить окно на две отдельных "панели". Этот виджет на самом деле содержит два дочерних виджета, но при этом количество дочерних виджетов является фиксированным, поэтому данный виджет является актуальным для данного раздела.
8.1.1. Фрейм (Frame)
Фреймы позволяют размещать один виджет или группу виджетов в ограниченной области, для которой при необходимости может быть установлен заголовок. К примеру, вы можете разместить группу радио-кнопок или флажков в фрейме.
8.1.1.1.Пример
Рисунок 8-1: Фрейм (Frame)
Файл examplewindow.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл examplewindow.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
8.1.2. Разделитель (Paned)
Разделители позволяют делить виджет на две части, причем граница разделения может перемещаться. Две части разделенного виджета (панели) могут быть ориентированы либо горизонтально (и находиться друг рядом с другом), либо вертикально (и находиться одна над другой).
В отличие от других виджетов из данного раздела, виджеты-разделители содержат не один, а два дочерних виджета, по одному на каждой из панелей. Исходя из этого, вы должны использовать методы add1()
и add2()
вместо метода add()
.
Вы можете установить позицию разделителя, воспользовавшись методом set_position()
, и, скорее всего, вам придется это сделать.
8.1.2.1. Пример
Рисунок 8-2: Разделитель (Paned)
Файл messagelist.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл examplewindow.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл messagetext.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл messagelist.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл examplewindow.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл messagetext.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
8.1.3. Окно прокрутки (ScrolledWindow)
Виджет окна прокрутки позволяет создать прокручиваемую область. Вы можете разместить виджет любого типа в окне прокрутки, после чего он будет доступен вне зависимости от размера благодаря наличию полос прокрутки. Следует учесть, что окно прокрутки не имеет отношения к классу Gtk::Window
, несмотря на вводящее в заблуждение название.
Окна прокрутки функционируют в соответствии с политиками использования полос прокрутки, которые устанавливают критерии показа полос прокрутки. Политики могут устанавливаться с помощью метода set_policy()
. В качестве политики могут использоваться константы Gtk::POLICY_AUTOMATIC
и Gtk::POLICY_ALWAYS
. Использование политики Gtk::POLICY_AUTOMATIC
приведет к показу полосы прокрутки только в том случае, когда находящийся в окне прокрутки виджет больше видимой области. Использование политики Gtk::POLICY_ALWAYS
приведет к показу полос прокрутки в любом случае.
8.1.3.1. Пример
Ниже приведен простой пример, в котором 100 кнопок-переключателей помещаются в окно прокрутки. Попробуйте изменить размер окна и обратите внимание на поведение полос прокрутки.
Рисунок 8-3: Окно прокрутки (ScrolledWindow)
Файл examplewindow.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл examplewindow.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
8.1.4. Фрейм с заданным соотношением сторон (AspectFrame)
Виджет фрейма с заданным соотношением сторон выглядит аналогично обычному виджету фрейма, но предусматривает принудительную установку соотношения сторон (отношения ширины к высоте) дочернего виджета, добавляя дополнительное пространство в случае необходимости. К примеру, данный виджет позволит вам показать фотографию, не позволяя пользователю исказить ее в горизонтальной или вертикальной плоскости в процессе изменения размера окна.
8.1.4.1. Пример
Следующая программа использует класс Gtk::AspectFrame
для вывода области рисования, соотношение сторон которой всегда будет 2:1 вне зависимости от того, как пользователь изменяет размер окна верхнего уровня.
Рисунок 8-4: Фрейм с заданным соотношением сторон (AspectFrame)
Файл examplewindow.h
(Для использования совместно с gtmm 3, а не с gtkmm 2)
Файл examplewindow.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
8.1.5. Выравнивание (Alignment)
Виджет выравнивания позволяет разместить дочерний виджет, установив его положение и размер относительно размера самого виджета выравнивания. Этот виджет, к примеру, может использоваться для центрирования виджетов.
Вы должны установить характеристики выравнивания при использовании конструктора виджета выравнивания или использовать метод set()
. В частности, вы не увидите никакого эффекта от использования виджета, пока не установите значение, отличное от 1.0 для параметров xscale
и yscale
, так как значение 1.0 означает, что дочерний виджет будет расширяться для заполнения всего доступного пространства.
8.1.5.1. Пример
Данный пример демонстрирует выравнивание кнопки по правой стороне окна с помощью виджета выравнивания.
Рисунок 8-5: Выравнивание (Alignment)
Файл examplewindow.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл examplewindow.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Обратитесь к разделу "Индикатор выполнения задачи" для ознакомления с еще одним примером использования виджета выравнивания.
Следующий раздел : 8.2. Контейнеры для множества виджетов.