2010-11-04 42 views
2

Je fais mon interface avec glade. Fonctionne très bien. J'écris une minuscule petite fonction principale qui appelle gtkbuilder et qui restitue tout dans le fichier glade.Il me manque quelque chose d'évident avec glade gtkbuilder et les signaux de connexion. Aidez-moi?

Gtk::Main kit(num, opts); 
// Load the GtkBuilder file and instantiate its widgets: 
Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("dsg.glade", "mainwindow"); 

Fonctionne encore mieux. Puis je reçois mon widget

Gtk::Button *sf = 0; 
builder->get_widget("button", sf); 

Maintenant quoi? Chaque exemple que j'ai trouvé pour connecter un gestionnaire de signal n'est pas construit par gtkbuilder. Si vous instanciez votre propre classe pour représenter/gérer/rendre un bouton, il est facile de connecter un gestionnaire de signal, mais j'utilise gtkbuilder et je ne vois pas comment écrire une fonction que je peux ensuite attacher à mon widget, puisque je n'étais pas celui qui créait l'objet bouton, gtkbuilder l'était. Est-ce que je fais une sous-classe de gtkbutton écrire ma fonction puis pointer vers cela? Mais ma classe n'est pas instanciée par gtkbuilder.

Je ne comprends tout simplement pas. Aidez-moi?

Répondre

4

Vous ne manquez pas quelque chose d'évident. Il semble que gtkmm ne fournisse pas une version C++ de la fonction gtk_builder_connect_signals(), ce qui est la façon dont vous le faites en C. J'ai fait quelques petites recherches sur Google, mais je n'arrive pas à comprendre pourquoi ils l'omettraient.

Vous pouvez accéder à la fonction C directement comme ceci:

Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("dsg.glade", "mainwindow"); 
gtk_builder_connect_signals(builder->gobj(), callback_data); 
+0

Merci bien. Content de savoir que je ne deviens pas fou. – stu

+0

Il semble que ce que vous avez à faire est de le connecter à une fonction autonome, comme dans une fonction qui ne fait pas partie d'une classe. Je peux voir pourquoi l'attacher à une classe serait un problème, en fait c'est le problème exact que j'ai, vous n'avez pas de code source pour l'objet qui recevrait le rappel. – stu

+0

Et j'imagine que le fait de le lier à une fonction C++ serait un PIA. J'imagine que je pourrais appeler gtk_builder_connect_signals() si je faisais tous mes gestionnaires de signaux extern "C" {} – stu

3

vous devez utiliser votre propre classe de bouton comme ceci:

#ifndef _MYBUTTON_H_ 
#define _MYBUTTON_H_ 

#include <gtkmm.h> 
class MyButton : public Gtk::Button { 
    public: 
    inline MyButton(BaseObjectType* cobject) : Gtk::Button(cobject) {}; 
    protected: 
    // overwrite virtual void on_pressed() function of Gtk::Button 
    void on_pressed() { /* do something */ }; 
}; 
#endif 

maintenant quelque part dans votre code principal (je l'ai mis dans mon classe de base qui est du public Gtk :: Window):

MyButton *sf; 
refBuilder_->get_widget_derived("button", sf); 

Je trouve cela dans leofficielil y a un mois et en l'utilisant avec succès dans mes applications GUI.

J'espère que cela aide.