Часть 3. Обзор виджетов

Содержание

3.1. Создание виджета
3.2. Иерархия виджетов
3.3. Виджеты без оконного интерфейса
3.4. Создание и уничтожение виджетов
3.5. Вывод и скртыие виджетов
3.6. Показ и запрет показа виджетов
3.7. Фокус и виджет по умолчанию
3.8. Чувствительность виджета
3.9. Установка положений и размеров виджетов

3.1. Cоздание виджета

Основные шаги для создание виджета в Gtk-Perl:
  1. new Gtk::Widget() - функция, создающая виждет.
  2. Обработка сигналов и событий, которые генерируются для управления программой.
  3. Установка атрибутов виджету.
  4. Привязка виджета в контейнеру, используя ссылки подобные $container->add(); или $box->pack_start();
  5. show() - вывод виджета на экран.

show() говорит Gtk-Perl что виджету выставлены все атрибуты и он может быть показан на экране. Можно так-же использовать hide() для скрытия виджета. Порядок, в котором будут выведены виждеты, не важен, но лучше, если виджет будет выведен сразу после его создания(некоторый стиль написания). Поотомки родительского виждета(window так-же явялется виждетом) появятся только тогда, когда будет показан их парент.

3.2. Иерархия виджетов

Иерархия виждетов показана в виде иерархии классов, в котором базовым для всего Gtk является класс Gtk::Object:

Gtk::Object +-Gtk::Widget | +-Gtk::Misc | | +-Gtk::Label | | | +-Gtk::AccelLabel | | | +-Gtk::TipsQuery | | +-Gtk::Arrow | | +-Gtk::Image | | +-Gtk::Pixmap | +-Gtk::Container | | +-Gtk::Bin | | | +-Gtk::Alignment | | | +-Gtk::Frame | | | | +-Gtk::AspectFrame | | | +-Gtk::Button | | | | +-Gtk::ToggleButton | | | | | +-Gtk::CheckButton | | | | | +-Gtk::RadioButton | | | | +-Gtk::OptionMenu | | | +-Gtk::Item | | | | +-Gtk::MenuItem | | | | | +-Gtk::CheckMenuItem | | | | | | +-Gtk::RadioMenuItem | | | | | +-Gtk::TearoffMenuItem | | | | +-Gtk::ListItem | | | | +-Gtk::TreeItem | | | +-Gtk::Window | | | | +-Gtk::ColorSelectionDialog | | | | +-Gtk::Dialog | | | | | +-Gtk::InputDialog | | | | +-Gtk::DrawWindow | | | | +-Gtk::FileSelection | | | | +-Gtk::FontSelectionDialog | | | | +-Gtk::Plug | | | +-Gtk::EventBox | | | +-Gtk::HandleBox | | | +-Gtk::ScrolledWindow | | | +-Gtk::Viewport | | +-Gtk::Box | | | +-Gtk::ButtonBox | | | | +-Gtk::HButtonBox | | | | +-Gtk::VButtonBox | | | +-Gtk::VBox | | | | +-Gtk::ColorSelection | | | | +-Gtk::GammaCurve | | | +-Gtk::HBox | | | +-Gtk::Combo | | | +-Gtk::Statusbar | | +-Gtk::CList | | | +-Gtk::CTree | | +-Gtk::Fixed | | +-Gtk::Notebook | | | +-Gtk::FontSelection | | +-Gtk::Paned | | | +-Gtk::HPaned | | | +-Gtk::VPaned | | +-Gtk::Layout | | +-Gtk::List | | +-Gtk::MenuShell | | | +-Gtk::MenuBar | | | +-Gtk::Menu | | +-Gtk::Packer | | +-Gtk::Socket | | +-Gtk::Table | | +-Gtk::Toolbar | | +-Gtk::Tree | +-Gtk::Calendar | +-Gtk::DrawingArea | | +-Gtk::Curve | +-Gtk::Editable | | +-Gtk::Entry | | | +-Gtk::SpinButton | | +-Gtk::Text | +-Gtk::Ruler | | +-Gtk::HRuler | | +-Gtk::VRuler | +-Gtk::Range | | +-Gtk::Scale | | | +-Gtk::HScale | | | +-Gtk::VScale | | +-Gtk::Scrollbar | | +-Gtk::HScrollbar | | +-Gtk::VScrollbar | +-Gtk::Separator | | +-Gtk::HSeparator | | +-Gtk::VSeparator | +-Gtk::Preview | +-Gtk::Progress | +-Gtk::ProgressBar +-Gtk::Data | +-Gtk::Adjustment | +-Gtk::Tooltips +-Gtk::ItemFactory

Знание этой иерархии важно, так как позволяет знать, какую функцию можно вызывать в кждом виджете. Для примера, SpinButton виджет относится к классу методов Entry, который в свою очередь является методом Editable и так далее.

3.3. Виджеты без оконного интерфейса

Следующие виджеты не ассоциированы с окнами. Если вы хотите обработать событие, то вы можете использовать EventBox.

Gtk::Alignment Gtk::Arrow Gtk::Bin Gtk::Box Gtk::Image Gtk::Item Gtk::Label Gtk::Pixmap Gtk::ScrolledWindow Gtk::Separator Gtk::Table Gtk::AspectFrame Gtk::Frame Gtk::VBox Gtk::HBox Gtk::VSeparator Gtk::HSeparator

Далее будет показан каждый из виджетов и создана простая функция, выводящая их на экран. Другой хороший источник примеров можно найти в исходниках GtkPerl.

3.4. Создание и уничтожение виджетов

Для создания виджета используйте

$widget = new Gtk::Widget();

Но помните, что при создании некоторых виджетов может понадобится несколько функций new() подобно функции new_with_label() для кнопок и деревьев.

Уничтожить виджет можно при помощи строчки

$widget -> destroy();

Если будет получен вызов зарезервированный как destroy, то он быдет выполнен для текущего виджета, но не для объекта, породившего этот виджет.

3.5. Вывод и скртыие виджетов

Следующие две функции показа и скрытия виджета уже были использованы нами в формах,Они показывают и скрывают виджет:

$widget->show(); $widget->show_now(); $widget->show_all(); $widget->hide(); $widget->hide_all();

Отметим, что если не показан контейнер, то не показан и виджет, содержащийся в этом контейнере. Рекомендуется, чтобы widgets показывался до содержания контейнеров, хотя точный порядок обычно не имеет значения, если окно показывается последним.

3.6. Показ и запрет показа виджетов

$widget->realize(); $widget->unrealize();

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

3.7. Фокус и виджет по умолчанию

Gtk-perl позволяет виждету считывать фокус с клавиатуры используя следующую функцию $widget->grab_focus();

Виджет также может быть установлен в режим по умолчанию, это можно сделать следующими строчками:

$widget->can_default( $default ); $widget->grab_default();

Запомните, что нужно вызывать can_default() до вызова grab_default(). Аргументом функции can_default() может быть истина или ложь, определяющие может ли быть виджет введен в режим по умолчанию.

3.8. Чувствительность виджета

Нечувствительный виджет не отвечает на ввод. Он может так-же обозначаться как бездействующий виджет. Установить чувствительность виджета можно, используя следующую функцию:

$widget->set_sensitive( $sensitive );

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

$widget->sensitive(); $widget->is_sensitive();

отличие этих функций в том, что первая только проверяет widgets на чувствительнсть, в то время как вторая проверяет чувствительность всей иерархии порожденых виждетов. Только вторая функция сообщит, является widget чувствительным или нет.

3.9. Установка положений и размеров виджетов

Помимо автоматической установки контейнера виджетов(имеется ввиду позиция и размер), можно вручную переопределять размеры и положение виждетов на экране, используюя функции

$widget->set_uposition( $x, $y ); $widget->set_usize( $width, $height );

Функция set_uposition() устанавливает левый верхний угод виджета на экране монитора на $x пикелов слева и $y пикселов сверху. Функция set_usize() устанавливает положение виджета с шириной в $width и высотой в $height пикселов сответственно. Необходимо быть осторожным при установке параметров виждетов, например если программа будет использоваться людьми со слабым зрением, то им нехобходимо увеличить размер управляющих кнопок, или просто позволить настроить программу под себя, В то-же время, если в программе используется показ деревьев каталогов, списков и или иных стандартных объектов, виджет должен быт стрго фиксирован в зависимости от числа и типа окна, дерева или иной специфичной для XWindow оболочки графической структуры.