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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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