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 :

Passer un titre de fenetre en gcallback


Sujet :

GTK+ avec C & C++

  1. #1
    Membre actif Avatar de bobyboby
    Inscrit en
    Septembre 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 108
    Par défaut Passer un titre de fenetre en gcallback
    Bonjour, je découvre GTK+ depuis quelques jours, et je bloque la dessus :

    Sur ma première fenetre, si je clique sur la croix ça déclanche l'ouverture d'une deuxieme fenetre. J'aimerai maintenant afficher le titre de la première fenetre dans un label de la 2e.

    j'ai essayé de passer la fenetre principale en paramètre mais ça ne marche pas du tout j'ai aussi essayé de passer seulement le titre mais j'ai pas réussi non plus
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    void mafonction(GtkWidget *widget, gpointer data)
    {
        /* Variables */
        GtkWidget * SecondWindow = NULL;
        GtkWidget *Label1;
        gchar* titre;
        /* Création de la fenêtre */
        SecondWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        g_signal_connect(G_OBJECT(SecondWindow), "delete-event", G_CALLBACK( fermer ), NULL);
     
        titre = gtk_window_get_title(GTK_WINDOW(MainWindow))	
        Label1 = gtk_label_new(titre);
        gtk_container_add(GTK_CONTAINER(SecondWindow), Label1);
     
        /* Affichage et boucle événementielle */
        gtk_widget_show_all(SecondWindow);
        gtk_main();
     
    }
     
    int main(int argc, char **argv)
    {
        /* Variables */
        GtkWidget * MainWindow = NULL;
    	const gchar* titre;
     
     
        /* Initialisation de GTK+ */
        gtk_init(&argc, &argv);
     
        /* Création de la fenêtre */
        MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(MainWindow), "yes");
        g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK( mafonction), MainWindow);
     
        /* Affichage et boucle événementielle */
        gtk_widget_show(MainWindow);
        gtk_main();
     
        /* Fermeture de GTK+ */
        gtk_exit(EXIT_SUCCESS);
        return EXIT_SUCCESS;
    }
    merci de votre aide!

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    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 315
    Billets dans le blog
    5
    Par défaut
    Ton problème est très classique. Tu déclares MainWindow dans le main();. Ce pointeur est donc local. Il n'existe que pour main();. Lorsque tu veux l'utiliser dans mafonction(); forcèment ca pose un problème puisqu'il n'existe pas ailleurs.

    La première solution et la plus laide est de déclarer MainWindow en global. Tu peux commencer par là pour essayer ton code.
    La deuxième solution, plus élégante, est de transmettre MainWindow à mafonction();. D'ailleurs c'est ce que tu tentes lors de la connexion de cette fonction.

    Oui mais alors pourquoi ca marche pas?

    Mainwindow existe dans mafonction(); sous le doux nom de gpointer data. Cast ce pointeur en GtkWidget* et tu verras que tout va aller pour le mieux.

  3. #3
    Membre actif Avatar de bobyboby
    Inscrit en
    Septembre 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 108
    Par défaut
    Ca marche pas héhé j'ai rajouté ça:

    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
    20
    21
     
    void mafonction(GtkWidget *widget, gpointer data)
    	{
    		// Variables //
    		GtkWidget * SecondWindow = NULL;
    		GtkWidget *Label1;
    		GtkWidget *MainWindow;
    		MainWindow = (GtkWidget*) data;
    		const gchar* titre = gtk_window_get_title(GTK_WINDOW(MainWindow));
     
    		// Création de la fenêtre //
    		SecondWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    		g_signal_connect(G_OBJECT(SecondWindow), "delete-event", G_CALLBACK( fermer ), NULL);
    		Label1 = gtk_label_new(titre);
    		gtk_container_add(GTK_CONTAINER(SecondWindow), Label1);
     
    		// Affichage et boucle événementielle //
    		gtk_widget_show_all(SecondWindow);
    		gtk_main();
     
    	}

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 108
    Par défaut Précision
    Passer dans CallBack mafonction(..,..,.., (gpointer)titre) où titre est celui que vous pouvez récupérer dans main.
    Ce sera beaucoup plus naturel et sûr.

    Cordialement.

  5. #5
    Membre actif Avatar de bobyboby
    Inscrit en
    Septembre 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 108
    Par défaut
    Pas d'erreur cette fois, mais le label est vide on dirait. J'ai mis ça :

    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
     
     
    //dans la main
    const gchar* titre;
    titre = gtk_window_get_title(GTK_WINDOW(MainWindow));
    g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK( mafonction), (gpointer)titre);
     
     
    //dans ma fonction callback
    void mafonction(GtkWidget *widget, gpointer data)
    {
        const gchar* titre2 = (const gchar*)data;
       /*.......
          ......*/
       Label1 = gtk_label_new(titre2);
    }
    mais le label reste vide, et quand je fais un cout<< il n'affiche rien non plus

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 108
    Par défaut
    Pour la dernière ligne, vous faites simplement
    label1 = gtk_label_new ((gchar *)data);

  7. #7
    Membre actif Avatar de bobyboby
    Inscrit en
    Septembre 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 108
    Par défaut
    Ca n'affiche rien

    peu être un problème ailleurs? pourtant si j'entre dans le label une chaine a la main ça ne pose pas de probleme, gtk_label_new("blablabal") fonctionne.

    après quelques tests, en effet la chaine est vide après le passage...

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    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 315
    Billets dans le blog
    5
    Par défaut
    Salut. Je reviens sur mon post.

    Ca marche pas et pourtant tu castes correctement data! Le problème est que tu ne respectes pas la définition du CallBack pour le signal "delete"event". Voila le prototype :
    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
    The "delete-event" signal
     
    gboolean            user_function                      (GtkWidget *widget,
                                                            GdkEvent  *event,
                                                            gpointer   user_data)      : Run Last
     
    The ::delete-event signal is emitted if a user requests that a toplevel window is closed. The default handler for this signal destroys the window. Connecting gtk_widget_hide_on_delete() to this signal will cause the window to be hidden instead, so that it can later be shown again without reconstructing it.
     
    widget :
    	the object which received the signal
     
    event :
    	the event which triggered this signal
     
    user_data :
    	user data set when the signal handler was connected.
     
    Returns :
    	TRUE to stop other handlers from being invoked for the event. FALSE to propagate the event further.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 108
    Par défaut Complément
    On peut également conserver le même code en remplaçant simplement "delete-event" (héritage de X11) par le signal "destroy" applicable à tous les widgets.

    Bonne soirée

  10. #10
    Membre actif Avatar de bobyboby
    Inscrit en
    Septembre 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 108
    Par défaut
    bah purée je pouvais chercher longtemps... j'ai aps testé encore mais ça m'a l'air honnête votre solution, merci bcp je test ca bientot!

  11. #11
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par KiKiTiTi Voir le message
    On peut également conserver le même code en remplaçant simplement "delete-event" (héritage de X11) par le signal "destroy" applicable à tous les widgets.
    Non c'est deux signaux ont des rôles différents :
    • delete-event : l'utilisateur demande la fermeture de la fenêtre, elle peux être refusée,
    • destroy : l'objet doit être détruit, gtk demande juste au développeur de libérer les ressources allouées.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 108
    Par défaut
    D'accord à 100% avec toi. Mais dans le cas des besoins de notre ami, le signal "destroy" me paraît beaucoup plus simple que "delete-event". Ce dernier réclame encore un retour "FALSE" pour déclencher la fonction gtk_widget_destroy comme le premier.

    Merci pour cette précision.

  13. #13
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par KiKiTiTi Voir le message
    D'accord à 100% avec toi. Mais dans le cas des besoins de notre ami, le signal "destroy" me paraît beaucoup plus simple que "delete-event". Ce dernier réclame encore un retour "FALSE" pour déclencher la fonction gtk_widget_destroy comme le premier.
    Non, premièrement je ne vois pas en quoi c'est plus simple et deuxièmement ça risque de causer des bugs bien plus complexes !

    En plus le signal destroy ne demande pas confirmation, c'est le signal destroy-event.

  14. #14
    Membre actif Avatar de bobyboby
    Inscrit en
    Septembre 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 108
    Par défaut
    En tout cas ca n'a jamais marché avec delete-event, et la avec destroy ca marche niquel

    MERCI LES MECS vous etes forts ahah!

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

Discussions similaires

  1. Changement Titre de fenetre lors d'une redirection
    Par Abac_Angelique dans le forum ASP.NET
    Réponses: 4
    Dernier message: 30/01/2008, 15h18
  2. Probleme d'affichage dans les titres des fenetres
    Par pierrot10 dans le forum Windows XP
    Réponses: 4
    Dernier message: 24/01/2008, 09h01
  3. Changer le titre du fenetre de confirmation
    Par youcef81 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/06/2006, 08h34
  4. Passer d'une simple fenetre à une multi ?
    Par Bruno13 dans le forum Delphi
    Réponses: 1
    Dernier message: 23/05/2006, 18h13
  5. MDI - passer un parametre à une fenetre fille
    Par amine245 dans le forum MFC
    Réponses: 8
    Dernier message: 05/04/2006, 16h23

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