Първото нещо, което трябва да направим е да заредим .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 е да направи връзка, чрез извикването на 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(); ?> |