21 июня 2009 г.

Базовые элементы интерфейса. Часть 4.

Базовые элементы интерфейса. Часть 1.
Базовые элементы интерфейса. Часть 2.
Базовые элементы интерфейса. Часть 3.

Данной статьёй я завершаю рассказ о базовых элементах интерфейса, т.к. все они уже были перечислены.


  • Регулятор вводимого значения GtkSpinButton. Он представляет из себя поле GtkEntry со стрелочками сбоку, предназначенными для изменения значения.



    Для создания такого регулятора необходимо методу GtkSpinButton::new_with_range() передать минимальное значение, максимальное и шаг изменения. Эти значения могут иметь тип double и int. При изменении значения издаётся сигнал 'value-changed'. У пользователя также имеется возможность вручную ввести значение. Для его фиксирования необходимо нажать Enter. О безопасности за нас позаботится PHP-GTK, т.к. в поле возможен ввод только цифр и если введённое число не укладывается в указанный нами диапазон, то оно автоматически сбросится на максимальное/минимальное, в зависимости от ситуации.
    $spin = GtkSpinButton::new_with_range(0, 1, 0.1);
    $spin->connect('value-changed', 'on_value_changed');
     
    function on_value_changed($spin)
    {
    echo "Выбранное значение: ".$spin->get_value()."\n";
    }

  • Раскрывающийся список GtkComboBox.



    За создание данного виджета отвечает класс GtkComboBox, но при его непосредственном вызове у меня программа возвращает ошибку сегментации (Segmentation fault), поэтому пришлось несколько исхитриться и использовать GtkComboBox::new_text(). А далее всё просто. Для добавления нового элемента в список используется метод append_text(). Каждому добавляемому элементу присваивается персональный номер, отсчёт ведётся от нуля. Методом set_active() устанавливаем активный элемент (это будет "Второй"). При изменении выбора издаётся сигнал 'changed', обработав который, мы методом get_active_text() получаем содержимое активного элемента.
    $combo = GtkComboBox::new_text();
    $combo->append_text('Первый');
    $combo->append_text('Второй');
    $combo->append_text('Третий');
    $combo->set_active(1);
    $combo->connect('changed', 'on_changed');
     
    function on_changed($combo)
    {
    echo $combo->get_active_text()."\n";
    }


    Полный код программы:
    <?php
     
    $window = new GtkWindow;
    $window->set_size_request(300, -1);
    $window->connect_simple('destroy', array('Gtk', 'main_quit'));
     
    $vbox = new GtkVBox;
     
    ///// GtkSpinButton /////
     
    $spin = GtkSpinButton::new_with_range(0, 1, 0.1);
    $spin->connect('value-changed', 'on_value_changed');
     
    function on_value_changed($spin)
    {
    echo "Выбранное значение: ".$spin->get_value()."\n";
    }
     
    ///// GtkComboBox /////
     
    $combo = GtkComboBox::new_text();
    $combo->append_text('Первый');
    $combo->append_text('Второй');
    $combo->append_text('Третий');
    $combo->set_active(1);
    $combo->connect('changed', 'on_changed');
     
    function on_changed($combo)
    {
    echo $combo->get_active_text()."\n";
    }
     
    //////////
     
    $hbox = new GtkHBox;
    $hbox->pack_start(new GtkLabel('Выберите значение'));
    $hbox->pack_start($spin, FALSE, FALSE);
    $vbox->pack_start(new GtkLabel(), FALSE, FALSE);
    $vbox->pack_start($hbox);
    $vbox->pack_start(new GtkLabel(), FALSE, FALSE);
    $vbox->pack_start($combo, FALSE, TRUE);
    $vbox->pack_start(new GtkLabel(), FALSE, FALSE);
    $window->add($vbox);
    $window->show_all();
    Gtk::main()
     
    ?>

2 комментария:

Gene комментирует...

Отличная статья!

Судя по мануалу, GtkComboBox::new_text() и есть корректный способ создания объекта GtkComboBox в случае, когда используется текстовая модель по умолчанию. Более того, отмечается, что методы append_text() , insert_text() , prepend_text() и remove_text() работают только для объектов, созданных именно таким образом, т.е. при помощи GtkComboBox::new_text()

Gene комментирует...

Кстати, при работе с Glade объект с использованием GtkComboBox::new_text () создается если стоит галка Translatable и в XML появляется элемент

Только приходится вначале ввести некий текст, потом его удалить, чтобы эта опция стала активной, в моей версии Glade это так почему-то.

Смысл этого в том, что я хочу определять элементы не в Glade, а из кода (особенно когда элементы в списке могут изменяться), и теми же простыми методами:

$combo = $glade->get_widget('combobox1');
$combo->append_text('Первый');
$combo->append_text('Второй');
$combo->append_text('Третий');