A primeira coisa a fazer é carregar o arquivo .glade da seção anterior. O construtor GladeXML leva o caminho do arquivo como primeiro parâmetro, assim tudo o que precisamos fazer é:
Exemplo 4.2. Carregando o arquivo .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(); ?> |
Ao executar o script, você irá notar que a janela com o botão aparece na sua tela, mas não reage a nada além de fechar a janela. Mesmo assim, a janela é destruÃda, mas seu script continua a executar - claramente um caso de falta de conexão de sinais.
Proximo, nós iremos conectar os sinais que nós conhecemos: Chamar connect ou connect_simple no objeto do widget. Para obter o objeto, use o metodo get_widget() e passe o nome do widget (id) para ele. Então faça o trabalho como de costume:
Exemplo 4.3. Obtendo e conectando widgets
<?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(); ?> |
Você provavelmente notou as tags <signal> no arquivo .glade - é possÃvel definir manipuladores de sinais diretamente no arquivo. Tudo o que nós temos que fazer é dizer ao Glade para estabelecer as conexões usando signal_autoconnect() .
Você pode definir nome de funções simples como manipulador que será chamado quando um evento ocorrer, ou usar uma notação especial para metodos estáticos, separando o nome de uma classe e o metodo da classe com dois pontos duplo como em NomeClasse::metodoClasse.
Exemplo 4.4. Usando 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(); ?> |
Apenas conectar funções ou metodos estáticos não prenche na realidade as necessidades de um bom programador. Para sair do código espagueti, nós precisamos ser capazes de conectar sinais a metodos de objetos.
Fazer isto é realmente simples: Apenas use signal_autoconnect_instance() com o objeto como primeiro parâmetro ao invéz de usar signal_autoconnect() :
Exemplo 4.5. Usando signal_autoconnect
<?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(); ?> |