2017-08-14 4 views
1

J'essaie d'utiliser Glade sur mon projet pour générer un fichier contenant des fenêtres, une grille ... Mais je suis coincé avec une erreur quand j'essaie d'écouter l'événement cliqué sur mes boutons, Je ne comprends pas pourquoi: sC - GTKUibuilder - Glade - erreur g_signal_connect

je suis arrivé ces erreurs ..

GLib-GObject-WARNING **: invalid (NULL) pointer instance 

(test:5608): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed 

... pour chaque auditeur.

donc mon fichier appelé "project_ui.ui" situé dans le même répertoire que mon main.c:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.20.0 --> 
<interface> 
    <requires lib="gtk+" version="3.20"/> 
    <object class="GtkWindow"> 
    <property name="visible">True</property> 
    <property name="can_focus">False</property> 
    <child> 
     <object class="GtkGrid"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <child> 
      <object class="GtkButton"> 
      <property name="label" translatable="yes">Button 1</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">1</property> 
      <property name="top_attach">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton"> 
      <property name="label" translatable="yes">Button 2</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">2</property> 
      <property name="top_attach">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton"> 
      <property name="label" translatable="yes">Button 0</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">0</property> 
      <property name="top_attach">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton"> 
      <property name="label" translatable="yes">Quit</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">0</property> 
      <property name="top_attach">1</property> 
      <property name="width">3</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

Mon main.c contient ce code:

#include <stdio.h> 
#include <gtk-3.0/gtk/gtk.h> 


static void printHello (GtkWidget *widget, gpointer data){ 
    g_print("Hello World \n"); 
} 

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

    gtk_init(&argc,&argv); 

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

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

    //Button 1 
    button = gtk_builder_get_object(builder, "Button 1"); 
    g_signal_connect(button, "clicked", G_CALLBACK(printHello), NULL); 

    //Button 2 
    button = gtk_builder_get_object(builder, "Button 2"); 
    g_signal_connect(button, "clicked", G_CALLBACK(printHello), NULL); 

    //Button 0 
    button = gtk_builder_get_object(builder, "Button 0"); 
    g_signal_connect(button, "clicked", G_CALLBACK(printHello), NULL); 

    //button Quit 
    button = gtk_builder_get_object(builder, "Quit"); 
    g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window); 

    gtk_main(); 
    return 0; 
} 

est quelqu'un a une idée de le corriger?

+0

Je viens d'essayer de suivre cet exemple: https://developer.gnome.org/gtk3/stable/ch01s03.html et obtenu exactement la même erreur ... signal ne veut pas écouter les boutons: s – nodeover

+0

Selon le message d'erreur, vous fournissez des pointeurs «NULL». Vous n'avez évidemment pas de problème avec la connexion du signal mais avec la récupération de l'objet depuis votre interface graphique. Vous pouvez vérifier vos valeurs de retour pour les pointeurs 'NULL'. – Gerhardh

+0

Vous pouvez vérifier la valeur de retour de 'gtk_builder_add_from_file' pour un début. Est-ce que le constructeur trouve même votre fichier d'interface utilisateur? – Gerhardh

Répondre

2

Je l'ai essayé avec ma machine Ubuntu avec Gtk 3.18.

Quand je charge votre fichier dans Glade Je ne reçois aucun message dans l'interface utilisateur, mais je reçois des messages d'erreur sur le shell:

(Glade: 2996): GladeUI-AVERTISSEMENT **: Le fichier ne contenait pas la propriété requise "id" Sous la balise "object".

Ceci est un bon indice. Si vous regardez dans votre exemple, que vous vous êtes connecté, vous trouverez ceci:

<object id="button2" class="GtkButton"> 

Vous avez seulement ceci:

<object class="GtkButton"> 

Sans l'ID du gtk_builder ne sait pas comment trouver ce widget.

parce que vous utilisez une valeur incorrecte pour rechercher dans vos widgets:

button = gtk_builder_get_object(builder, "Button 1"); 

Ce n'est que le texte affiché sur le bouton. Ce que vous devez utiliser est l'identifiant qui est manquant. L'exemple utilise ce code:

button = gtk_builder_get_object (builder, "button1"); 

Ici, l'ID est utilisé pour récupérer le pointeur sur le widget.

Pour résoudre votre problème, vous devez ajouter des ID à vos widgets et utiliser les ID pour les récupérer au lieu du texte sur l'étiquette.

+0

Merci !! C'était en fait environ 90% de la réponse pour mon cas, En fait, je devais indiquer le chemin exact vers mon fichier d'interface utilisateur, cela ne fonctionne pas avec relativ path: s – nodeover