2012-02-01 1 views
2

J'essaie de connecter un signal GtkAction au callback open_file mais apparemment il me manque quelque chose car il ne se passe rien lorsque je sélectionne Ouvrir dans le menu fichier. Des indices?Comment connecter le signal GtkAction?

test.c

#include <gtk/gtk.h> 

void open_file(GtkAction *action, gpointer user_data) 
{ 
    g_print("open_file\n"); 
} 


int main(int argc, char *argv[]) 
{ 
    GtkBuilder *builder; 
    GObject *window; 

    gtk_init(&argc, &argv); 

    builder = gtk_builder_new(); 
    gtk_builder_add_from_file(builder, "test.ui", NULL); 

    window = gtk_builder_get_object(builder, "window"); 
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); 
    gtk_widget_show_all(GTK_WIDGET(window)); 

    gtk_main(); 
    return 0; 
} 

test.ui

<interface> 
    <object class="GtkUIManager" id="uiman"> 
    <child> 
     <object class="GtkActionGroup" id="actiongroup"> 
      <child> 
       <object class="GtkAction" id="file"> 
       <property name="label">_File</property> 
       </object> 
      </child> 
      <child> 
       <object class="GtkAction" id="open"> 
       <property name="stock_id">gtk-open</property> 
       <signal name="activate" handler="open_file"/> 
       </object> 
      </child> 
     </object> 
    </child> 
    <ui> 
     <menubar name="menu_bar"> 
      <menu action="file"> 
       <menuitem action="open"/> 
      </menu> 
     </menubar> 
    </ui> 
    </object> 

    <object id="window" class="GtkWindow"> 
    <property name="title">Test</property> 
    <child> 
     <object class="GtkVBox" id="vbox"> 
      <child> 
       <object class="GtkMenuBar" id="menu_bar" constructor="uiman"/> 
       <packing> 
       <property name="expand">FALSE</property> 
       </packing> 
      </child> 
     </object> 
    </child> 
    </object> 
</interface> 
+0

Y at-il des messages d'erreur sur la console? – sarnold

+0

Aucun message d'erreur et aucun message "open_file" non plus. –

Répondre

2

Les signaux dans le fichier Glade restent déconnectés sauf si vous appelez gtk_builder_connect_signals().

+0

OK, j'ai ajouté la ligne gtk_builder_connect_signals (builder, NULL) mais maintenant j'obtiens le message d'erreur "(test: 2075): Gtk-WARNING **: Impossible de trouver le gestionnaire de signal 'open_file'". –

+0

Êtes-vous sur Windows? Ensuite, vous devez ajouter G_MODULE_EXPORT devant la définition de la fonction 'open_file'. – ptomato

+0

Après avoir ajouté gmodule-2.0 à la commande pkg-config dans la commande de compilation, cela fonctionne. J'ai également changé gtk_builder_connect_signals (builder, NULL) en gtk_builder_connect_signals (constructeur, fenêtre) pour obtenir la fenêtre à l'intérieur du gestionnaire (ne sais pas si c'est l'approche standard si). –

1

Si vous avez l'intention de transférer votre programme pour Windows, vous pouvez aussi avoir besoin d'utiliser G_MODULE_EXPORT dans vos prototypes/définitions fonction:

G_MODULE_EXPORT void my_callback(void); /* For example */ 
+0

merci qui a aidé à lier mon signal, avant d'utiliser '--export-all-symbols' – Sebastian

Questions connexes