Il me manque quelque chose d'évident avec GtkBuilder Glade et les signaux de connexion. Aidez-moi?

StackOverflow https://stackoverflow.com/questions/4098636

  •  29-09-2019
  •  | 
  •  

Question

Je fais mon interface avec Glade. Fonctionne très bien. Je vous écris un petit peu la fonction principale qui appelle GtkBuilder et rend tout dans le fichier Glade.

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 obtenir mon widget de

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

Et maintenant? Chaque exemple, je l'ai trouvé pour connecter un gestionnaire de signal ne se construit pas par GtkBuilder. Si vous instanciez votre propre classe pour représenter / poignée / 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 créant l'objet bouton, GtkBuilder était.

Dois-je faire une sous-classe de GtkButton écrire ma fonction puis pointez sur cela? Mais ma classe n'est pas instancié par GtkBuilder.

Je ne comprends pas. Aide?

Était-ce utile?

La solution

Vous ne manque pas quelque chose d'évident. Il semble que gtkmm ne fournit pas une version C ++ de la fonction gtk_builder_connect_signals(), ce qui est la façon dont vous le faites en C. Je l'ai fait un peu de recherche Google, mais je ne peux pas comprendre pourquoi ils laisseraient dehors.

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);

Autres conseils

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

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

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

J'ai trouvé dans la langue officielle

scroll top