2010-11-03 37 views
0

J'écris mon premier programme gtk, en utilisant gtkmm, et glade. J'ai fait un filechooserbuttonbutton et il a un signal appelé file-set Donc je l'ai réglé à ce que je suppose être le nom de la fonction que je veux appeler quand le fichier est choisi. Mais je vois ici: http://library.gnome.org/devel/gtkmm-tutorial/unstable/sec-builder-accessing-widgets.html.enDois-je attacher manuellement un gestionnaire de signal gtk lorsque j'ai spécifié le nom de la fonction dans glade?

qu'ils obtiennent manuellement le widget de dialogue et définir un gestionnaire de signal de bouton dans le code. Quelle est la bonne façon de le faire?

Et même si je suis ici, tout lien vers de bons exemples serait pratique, ils semblent être rares. Merci.

Répondre

0

Voilà comment je l'ai fait:

// create the UI 
refUI = Gtk::Builder::create(); 
refUI->add_from_file(grq::GLADE_FILE); 

// grab your widget 
refUI->get_widget("but_new", but_new); // Gtk::ToolButton *but_new; 
but_new->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::on_new_game)); 

// your signal handler looks something like this :) 
void MainWindow::on_new_game() {} 

modifier:

Fondamentalement, le * Ceci est l'objet sur lequel vous appellerez la fonction de votre gestionnaire de signal.

C'est ce que mes principaux ressemble:

int main(int argc, char **argv) { 

    Gtk::Main  kit(argc, argv); 
    MainWindow  main_window; 

    kit.run(*main_window.window); 

    return 0; 
} 

MainWindow est fondamentalement une classe qui enveloppe GtkWindow et définit les widgets, a. la .:

class MainWindow 
{ 

private: 
Glib::RefPtr<Gtk::Builder> refUI; 

// 
// Widgets 
// 

Gtk::ToolButton *but_about; 

public: 

// The window. This is public so we can hook into events and 
// call kit.run(window) against it, if needed. 
Gtk::Window *window; 


MainWindow() 
{ 
    // Load the data for this window and it's widgets. 
    refUI = Gtk::Builder::create(); 
    refUI->add_from_file(grq::GLADE_FILE); 


    // The window 
    refUI->get_widget("main_window", window); 


    // Widgets    
    refUI->get_widget("but_about", but_about); 
    but_about->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::on_about)); 

      ... 

} 


virtual ~MainWindow() 
{ 
    if (window != NULL) 
    { 
     delete window; // Frees all the children for the window, too. 
    } 
} 

    virtual void on_about() 
    { 
      // stuff 
    } 

}; 

Espérons que cela aide!

+0

http://library.gnome.org/devel/gtkmm-tutorial/unstable/sec-signals-overview.html.en bien que le fait de savoir à quel signal se connecter ne soit pas trivial: S –

+0

Bon, j'ai vu que dans une tonne d'endroits ... ce que je ne reçois pas est la * cette partie. – stu

+0

Qu'est-ce que 'ceci' dans ce contexte? – stu

0

J'ai trouvé la réponse à ma question après coup dans une autre question de stackoverflow.

Mais je ne me souviens pas lequel c'était.

La réponse semble être que vous devez ajouter par programme le gestionnaire de signal au widget dans votre code, le gtkbuilder ne le fera pas pour vous.