Forum und email

Зареждане на файлът

Първото нещо, което трябва да направим е да заредим .glade файла. GladeXML конструктора взема за първи параметър пътят до файла, така че единственото нещо, което трябва да направим е:

Пример 4.2. Зареждане на .glade файла

<?php
//Create a new glade instance, load the 
// widgets from the file passed as parameter
$glade = new GladeXML('helloglade.glade');

//Start the main loop
Gtk::main();
?>

При изпълнението на скрипта ще видите, че на вашият екран са изобразени прозорец с бутон, но единственото нещо, което можете да правите, е да затворите прозореца. Вижда се, че въпреки че сте затворили прозореца, вашият скрипт продължава да функционира - това се получава най-често, когато липсва връзка към даден сигнал.

Ръчно свързване на сигналите

Следващото нещо е просто да свържем сигналите: чрез извикване на connect или connect_simple за уйджет обект. За получаване на обекта използвайте метода get_widget() и подайте името му (id) към него. След което продължаваме по стандартният начин:

Пример 4.3. Вземане и свързване на уйджети

<?php
//Create a new glade instance, load the
// widgets from the file passed as parameter
//We use the absolute file path as it is not uncommon
// that the application is run from a different working directory
$glade = new GladeXML(dirname(__FILE__) . '/helloglade.glade');

//Nothing happened when you clicked the button or closed
// the window with Step 1's code.
//Here we manually connect the widget signals as you know it
$window = $glade->get_widget('wndClose');
$window->connect_simple('destroy', array('Gtk', 'main_quit'));

//Again, get the widget object and connect the clicked signal
$button = $glade->get_widget('btnClose');
$button->connect_simple('clicked', 'onClickButton');

//This method is called when the button is clicked
function onClickButton() {
    echo "button clicked!\r\n";
    Gtk::main_quit();
}

//Start the main loop
Gtk::main();
?>

Изполване на Glade за свързване на сигнали

Може би сте забелязали, че вътре в .glade файла можете директно да дефинирате кой ще обработва сигналът. Единственото нещо е да кажете на Glade е да направи връзка, чрез извикването на signal_autoconnect() .

Можете да дефинирате име на проста функция, които при възникване на дадено действие ще беди извикан или специална анотация към извикване на статичен метод чрез отделянето името на класа и на метода чрез двойно двоеточие Classname::methodName.

Пример 4.4. Изполване на signal_autoconnect

<?php
//Create a new glade instance, load the
// widgets from the file passed as parameter
//We use the absolute file path as it is not uncommon
// that the application is run from a different working directory
$glade = new GladeXML(dirname(__FILE__) . '/helloglade.glade');

//Let glade do all the signal connections we specified in the file
$glade->signal_autoconnect();

//This method is called when the button is clicked
function onClickButton() {
    echo "button clicked!\r\n";
    Gtk::main_quit();
}

//Start the main loop
Gtk::main();
?>

Свързване с обектен метод

За добрите програмисти свързването към прости функции или статични методи няма да бъде достатъчно. За да не бъде разтеглен много нашият код е необходимо да можем да свържем сигналите с методи от обекти.

Направата на това е много просто: Използвайте signal_autoconnect_instance() с обекта като първи параметър вместо да ползвате signal_autoconnect() :

Пример 4.5. Използване на signal_autoconnect_instance

<?php
//Here we use an object and connect all the
// signals to *object methods* instead of
// functions

class MyClass {
    //This method is called when the button is clicked
    function onClickButton() {
        echo "MyClass->onClickButton!\r\n";
        Gtk::main_quit();
    }

    function staticMethod() {
        echo "MyClass::staticMethod()\r\n";
    }
}

$glade = new GladeXML(dirname(__FILE__) . '/helloglade.glade');

//Let glade do all the signal connections we specified in the file
// but this time, connect to the object methods
$myClassInstance = new MyClass();
$glade->signal_autoconnect_instance($myClassInstance);

//Start the main loop
Gtk::main();
?>