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

Vue hybride

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

+ 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