IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

Y aurait-il un subtilité aux fonctions g_signal_connect/G_CALLBACK ?


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut Y aurait-il un subtilité aux fonctions g_signal_connect/G_CALLBACK ?
    Bonjour,

    Je suis étudiant en informatique, (en vacances mais) j'ai décidé d'apprendre à utiliser GTK.

    J'ai une erreure qui me semble "louche".
    Je crée une fenêtre contenant un boutton sensé ouvrir une seconde fenêtre.
    Pour plus de clarté j'ai fais une structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct _Window
    {
    	GtkWidget *window;
    	GtkWidget *table;
    	GtkWidget *label;
    	GtkWidget *button;
    	GtkWidget *entry;
    };
    typedef struct _Window Window;
    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    /* ... */
    int main(int argc, char **argv)
    {
    /* ... */
    maFenetreSecondaire = g_malloc(sizeof(Window));
    initWindow((gpointer) maFenetreSecondaire); // Fonction de ma confection
     
    maFenetrePrincipale = g_malloc(sizeof(Window));
    initWindow((gpointer) maFenetrePrincipale);
    /* ... */
    g_signal_connect(G_OBJECT(monBoutton), "clicked",
    				G_CALLBACK(popUp), (gpointer)maFenetreSecondaire);
    /* ... */
    gtk_widget_show_all(maFenetrePrincipale -> window);
    gtk_main();
    return EXIT_SUCCESS;
    }
    Ce qui me retourne l'erreur suivante :
    Gtk-CRITICAL **: gtk_widget_show_all: assertion `GTK_IS_WIDGET (widget)' failed
    Alors que si je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gtk_widget_show_all(maFenetreSecondaire -> window);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    popUp((gpointer)maFenetreSecondaire);
    Ce qui est sensé être fait au "click", gela ne me retourne pas d'erreur !

    Auriez vous une idée ?
    Merci!

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Il faudrait montrer ce que tu fais dans initWindow et popup. Je ne suis pas sûr à quel moment exactement le warning apparaît.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    popUp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /* [...] */
    void popUp(gpointer data)
    {
    	/* Déclarations: */
    	Window	*win	= (Window*) data;
     
    	/* Afficher la fenêtre de la structure en entrée: */
    	gtk_widget_show_all(win -> window);
    }
    initWindow :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    void initWindow(gpointer data, gboolean isMain)
    {
    	/* Déclarations: */
    	Window 	*win	= (Window*) data;
     
    	/* Création de la fenêtre: */
    	win -> window = gtk_window_new(GTK_WINDOW_TOPLEVEL);						// Création de la fenêtre
    	gtk_window_set_title(GTK_WINDOW(win -> window), "myCipher");					// Ajout d'un titre
       	 gtk_window_set_icon_from_file(GTK_WINDOW(win -> window), "./images/icon.ico", NULL);		// Ajout d'une icône
    	gtk_window_set_default_size(GTK_WINDOW(win -> window), WIDTH, HEIGHT);				// Définition des dimensions (defines)
    	gtk_window_set_position(GTK_WINDOW(win -> window), GTK_WIN_POS_CENTER);				// Positionnée au centre de l'écran
    	if (!isMain)
    		g_signal_connect(G_OBJECT(win -> window), "destroy",					// Action à la fermeture
        					G_CALLBACK(gtk_widget_destroy), win);
        	else
       	 	g_signal_connect(G_OBJECT(win -> window), "destroy",
        					G_CALLBACK(gtk_main_quit), win);
    }
    Merci de ton aide.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    Bonjour,

    Désolé d'insiter mais les vacances se terminent bientôt...

    Merci !

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Je vois rien d'évident à première vue, il va falloir que tu trifouilles un peu ton code Si tu bouges le gtk_widget_show_all juste après les appels à initWindow, ça fonctionne?

  6. #6
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Déjà, ajoute des g_debug (G_STRLOC) à certains endroits, pour localiser la ligne qui provoque l'erreur, ça permettra de dégrossir... Ou utilise un débuggeur.

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Le prototype de la fonction void popUp(gpointer data) n'est pas correcte pour le signal "clicked". Voir la documentation.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    Bonjour,

    Je vois rien d'évident à première vue, il va falloir que tu trifouilles un peu ton code Si tu bouges le gtk_widget_show_all juste après les appels à initWindow, ça fonctionne?
    Comme je l'ai dis si je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_widget_show_all(maFenetreSecondaire);
    dans le main, il n'y a pas de soucis.

    Le prototype de la fonction void popUp(gpointer data) n'est pas correcte pour le signal "clicked". Voir la documentation.
    Ah, c'est bien là que se cache la subtilitée dont je n'étais pas au courant.
    Ce qui fait qu'un appel directe à la fonction popUp ou un gtk_widget_show_all fonctionne quand un G_CALLBACK ne fonctionne pas ! Merci
    Je n'ai plus l'erreur :
    Gtk-CRITICAL **: gtk_widget_show_all: assertion `GTK_IS_WIDGET (widget)' failed
    Déjà, ajoute des g_debug (G_STRLOC) à certains endroits, pour localiser la ligne qui provoque l'erreur, ça permettra de dégrossir... Ou utilise un débuggeur.
    Merci pour cette astuce.

    J'ai une nouvelle erreure, je vais chercher un peu, je vous tient au courant
    EDIT : Lorsque j'initialise maFenetreSecondaire je déclare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(fenetreCourante -> fenetre), "destroy", G_CALLBACK(gtk_widget_hide), fenetreCourante);
    Lorsque je clique sur la "croix" la fenêtre disparait effectivement mais si je souhaite l'afficher une nouvelle fois j'ai l'erreur :
    Gtk-CRITICAL **: gtk_widget_show_all: assertion `GTK_IS_WIDGET (widget)' failed
    Une idée ?

    Merci pour vos aide respective en tout cas !

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Le gtk_widget_destroy a pour effet de détruire la fenêtre, donc par la suite tu ne peux plus la réutiliser, il faut la recréer. Essaie avec gtk_widget_hide plutôt.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    Euh... ,

    Ce n'est pas ce que j'ai mis ?

    Je me cite :
    Citation Envoyé par HechMan
    g_signal_connect(G_OBJECT(fenetreCourante -> fenetre), "destroy", G_CALLBACK(gtk_widget_hide), fenetreCourante);
    Merci.

  11. #11
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Ah j'étais revenu au premier post moi, j'ai pas regardé tes dernières modifs
    gtk_widget_hide_on_delete connecté sur le delete-event doit faire ce que tu veux.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    Effectivement cela marche !

    Alors quelle difference y a t-il entre :

    g_signal_connect(G_OBJECT(fenetreCourante -> fenetre), "destroy", G_CALLBACK(gtk_widget_hide), fenetreCourante);
    et
    g_signal_connect(G_OBJECT(fenetreCourante -> fenetre), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), fenetreCourante);
    Merci.

  13. #13
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Quand le signal "destroy" est appelé, il est peut être trop tard pour empêcher la fenêtre d'être détruire (ie le _hide) ne sert à rien. Dans le "delete-event", tu peux choisir de renvoyer TRUE pour bloquer la propagation du signal et empêcher que la fenêtre ne soit détruite, hide_on_delete renvoie TRUE après avoir appelé gtk_widget_hide

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    Une dernière question sans rapport et je notifirais que ce topic est [Résolu] :

    Pourquoi dans les exemples de code il y a souvent un "p" devant les noms de variables, par exemple "pLabel", "pWindow", ... ?

    EDIT: Aprés une fulgurance subite j'imagine que cela définit un pointer ?

    Merci beaucoup à tous.

  15. #15
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Oui, je crois que ça correspond à "pointeur". Je tiens à dire que je n'aime pas du tout ça

  16. #16
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par HechMan Voir le message
    Pourquoi dans les exemples de code il y a souvent un "p" devant les noms de variables, par exemple "pLabel", "pWindow", ... ?
    C'est hérité de la notation hongroise, et ça pue. Pour développer un peu, voici un article traitant du sujet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.Net] Comment accéder aux fonctions du C++ ?
    Par devmat dans le forum Services Web
    Réponses: 2
    Dernier message: 17/03/2006, 20h27
  2. Réponses: 2
    Dernier message: 30/01/2006, 12h30
  3. Appel aux fonctions d'une DLL externe ??
    Par Fbartolo dans le forum Access
    Réponses: 7
    Dernier message: 21/11/2005, 17h54
  4. Réponses: 5
    Dernier message: 19/09/2005, 20h58
  5. Réponses: 4
    Dernier message: 28/03/2005, 12h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo