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 :

GtkStatusbar + date


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut GtkStatusbar + date
    Bonjour,

    Je souhaite afficher la date du jour et l'heure (avec refresh) dans ma GtkStatusbar dès l'affichage de ma fenetre.
    J'ai essayé avec le code ci-dessous pour un exemple mais rien ne s'affiche:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_statusbar_push (GTK_STATUSBAR (widget), GPOINTER_TO_INT(user_data), "Quitter l'application");

    Par avance merci.

    P.S : Je sais que dans mon code ne n'affiche pas la date mais c t juste un test

  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 faut peut etre utiliser gtk_statusbar_get_context_id plutot que ton G_POINTER_TO_UINT comme second argument ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    Il faut peut etre utiliser gtk_statusbar_get_context_id plutot que ton G_POINTER_TO_UINT comme second argument ?
    En fait, j'avais déjà essayé avant de poster mon premier message. Le G_POINTER_TO_UINT récupère le gtk_statusbar_get_context_id que j'envoie lorsque j'appelle ma fonction de callback.

    Donc je ne pense pas que cela vienne de là!! Si qqn a une autre solution à proposer ??

  4. #4
    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
    Citation Envoyé par kenshi240683 Voir le message
    Donc je ne pense pas que cela vienne de là!!
    Quand on debugge un pb obscur, il faut éviter au maximum de penser, et être certain de ce qu'on avance. Donc si tu n'es pas 100% sur que ça ne vient pas de la, il vaut mieux remplacer le GPOINTER_TO_UINT pour la durée d'un test, ca ne te coute rien du tout

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    Quand on debugge un pb obscur, il faut éviter au maximum de penser, et être certain de ce qu'on avance. Donc si tu n'es pas 100% sur que ça ne vient pas de la, il vaut mieux remplacer le GPOINTER_TO_UINT pour la durée d'un test, ca ne te coute rien du tout
    Il est vrai que je n'avais pas mis le code donc tu pouvais pas savoir que je l'utilisais déjà

    Voici le code
    Code C : 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
     
    // fichier interface.c
    // On met un contexte
    iContextId1 = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar2), "date");
     
    // On passe le contexte à la fonction de callback
    g_signal_connect ((gpointer) fen_Operationnel, "show",
                        G_CALLBACK (on_fen_Operationnel_show),
                        GINT_TO_POINTER(iContextId1));
     
    // Fonction de callback
     void
    on_fen_Operationnel_show               (GtkWidget       *widget,
                                            gpointer         user_data)
    {
    	gtk_statusbar_push (GTK_STATUSBAR (widget), GPOINTER_TO_INT(user_data), "Quitter l'application");
    }

    Rien ne s'affiche. J'ai bien vérifier si cette fonction était appelé et on passe bien sur l'intruction.

    Voilà j'espère avoir été plus clair.

    Mais le problème persiste ......

    GINT_TO_POINTER(iContextId1)));

  6. #6
    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
    Serieusement, ca te coute quoi de changer ton GPOINTER_TO_INT en un appel direct à gtk_statusbar_get_context_id ? Je suis d'accord que dans ce cas, il est très peu probable que ca change quoi que ce soit, mais si pour une raison obscure ça tombe en marche avec ce changement, t'auras au moins un moyen de progresser.

  7. #7
    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 : 41
    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 teuf13 Voir le message
    Serieusement, ca te coute quoi de changer ton GPOINTER_TO_INT en un appel direct à gtk_statusbar_get_context_id ? Je suis d'accord que dans ce cas, il est très peu probable que ca change quoi que ce soit, mais si pour une raison obscure ça tombe en marche avec ce changement, t'auras au moins un moyen de progresser.
    Entièrement d'accord, surtout que la conversion int <-> pointeur n'est pas portable : GINT_TO_POINTER()

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    Citation Envoyé par gege2061 Voir le message
    Entièrement d'accord, surtout que la conversion int <-> pointeur n'est pas portable : GINT_TO_POINTER()
    J'ai essayé ce que vous m'avez dit (toi et teuf13)

    Voici le code:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Fonction de callback
    void
    on_fen_Operationnel_show               (GtkWidget       *widget,
                                            gpointer         user_data)
    {
    	gtk_statusbar_push (GTK_STATUSBAR (widget), gtk_statusbar_get_context_id (GTK_STATUSBAR (widget),"date"), "Quitter l'application");
    }
     
    // Connection du signal
    g_signal_connect ((gpointer) fen_Operationnel, "show",
                        G_CALLBACK (on_fen_Operationnel_show),
                        NULL);

    Le problème persiste tjs !!!

    Une autre solution à proposer ??

    P.S: La solution mise en place venait du site www.developpez.net (http://gtk.developpez.com/cours/gtk2...rre.d.etat.php)

  9. #9
    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
    J'utilise les GtkStatusBar sans aucun problème. Généralement j'effectue un gtk_statusbar_pop(); avant de mettre une nouvelle info dedans. Essaies de ce côté là peut être.
    Autre point. "fen_Operationnel", c'est quoi exactement? Le widget GtkStatusBar ou bien la fenêtre qui contient ton GtkStatusBar ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    J'utilise les GtkStatusBar sans aucun problème. Généralement j'effectue un gtk_statusbar_pop(); avant de mettre une nouvelle info dedans. Essaies de ce côté là peut être.
    Autre point. "fen_Operationnel", c'est quoi exactement? Le widget GtkStatusBar ou bien la fenêtre qui contient ton GtkStatusBar ?
    Salut gerald3d !!
    Ma fen_Operationnel est ma fenetre principale qui contient l'ensemble de mes widgets et notamment ma "statusbar2".
    Il est vrai que j'avais oublié de la passer à ma fonction de callback (dsl parfois je suis distrait )

    Voici le code qui fonctionne:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Fonction de callback (fenêtre principale qui s'affiche)
    void
    on_fen_Operationnel_show               (GtkWidget       *widget,
                                            gpointer         user_data)
    {
    	gtk_statusbar_pop(GTK_STATUSBAR (widget), gtk_statusbar_get_context_id (GTK_STATUSBAR (widget),"date")); 
    	gtk_statusbar_push (GTK_STATUSBAR (widget), gtk_statusbar_get_context_id (GTK_STATUSBAR (widget),"date"), "Quitter l'application");
    }
     
    // connection du signal
    g_signal_connect_swapped ((gpointer) fen_Operationnel, "show",
                                G_CALLBACK (on_fen_Operationnel_show),
                                GTK_OBJECT (statusbar2));

    Par contre, même si cela fonctionne, je ne comprends pas trop pourquoi il faut faire un "gtk_statusbar_pop()" avant. Nul par dans mon code j'ai fait un autre "gtk_statusbar_push()". Si qqn peut eclaicir ce point.

    Par contre maintenant, j'aimerais afficher l'heure et la date système à la place de la chaîne de caractère "Quitter l'application" et que l'heure et la date soit réactualisé "comme une horloge".

    qqn peut m'aider sur ce point ?

  11. #11
    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
    Citation Envoyé par kenshi240683 Voir le message
    Voici le code qui fonctionne:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Fonction de callback (fenêtre principale qui s'affiche)
    void
    on_fen_Operationnel_show               (GtkWidget       *widget,
                                            gpointer         user_data)
    {
    	gtk_statusbar_pop(GTK_STATUSBAR (widget), gtk_statusbar_get_context_id (GTK_STATUSBAR (widget),"date")); 
    	gtk_statusbar_push (GTK_STATUSBAR (widget), gtk_statusbar_get_context_id (GTK_STATUSBAR (widget),"date"), "Quitter l'application");
    }
     
    // connection du signal
    g_signal_connect_swapped ((gpointer) fen_Operationnel, "show",
                                G_CALLBACK (on_fen_Operationnel_show),
                                GTK_OBJECT (statusbar2));
    J'écrirai plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void
    on_fen_Operationnel_show               (GtkWidget       *widget,
                                            GtkWidget *statusbar)
    {
    	gtk_statusbar_pop(GTK_STATUSBAR (statusbar), gtk_statusbar_get_context_id (GTK_STATUSBAR (statusbar),"date")); 
    	gtk_statusbar_push (GTK_STATUSBAR (statusbar), gtk_statusbar_get_context_id (GTK_STATUSBAR (statusbar),"date"), "Quitter l'application");
    }
    Peut être que maintenant tu peux éviter le gtk_statusbar_pop();. Cependant tu en auras besoin pour la mise à jour de ton heure.

    Pour commencer à répondre à ta dernière question il faudra plutôt appeler cette fonction avec un g_timeout_add(); toutes les secondes si tu veux voir les secondes ou toutes les minutes dans le cas contraire. Ensuite dans ta fonction il te "suffit" de récupérer la date et l'heure, de formater tout ca en gchar* et ensuite de l'afficher comme tu le fais avec ton exemple.

  12. #12
    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
    strftime devrait te permettre de faire ce que tu veux

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    J'écrirai plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void
    on_fen_Operationnel_show               (GtkWidget       *widget,
                                            GtkWidget *statusbar)
    {
    	gtk_statusbar_pop(GTK_STATUSBAR (statusbar), gtk_statusbar_get_context_id (GTK_STATUSBAR (statusbar),"date")); 
    	gtk_statusbar_push (GTK_STATUSBAR (statusbar), gtk_statusbar_get_context_id (GTK_STATUSBAR (statusbar),"date"), "Quitter l'application");
    }
    Peut être que maintenant tu peux éviter le gtk_statusbar_pop();. Cependant tu en auras besoin pour la mise à jour de ton heure.

    Pour commencer à répondre à ta dernière question il faudra plutôt appeler cette fonction avec un g_timeout_add(); toutes les secondes si tu veux voir les secondes ou toutes les minutes dans le cas contraire. Ensuite dans ta fonction il te "suffit" de récupérer la date et l'heure, de formater tout ca en gchar* et ensuite de l'afficher comme tu le fais avec ton exemple.
    Sache que "g_signal_connect_swapped()" inverse les paramètres. De plus, j'utilise glade comme générateur de code. Donc pas moyen de récrire les structures des fonctions de callbacks comme tu l'as ecrit ci-dessus.

    Si tu pouvais me donner en gros la façon d'utiliser le g_timeout_add() dans mon cas car j'arrive à afficher l'heure, il me reste juste à l'actualiser à intervalle de temps réguliers.

    Merci (dsl je suis novice )

  14. #14
    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
    Au temps pour moi, j'ai répondu un peu vite pour le g_signal_connect_spawned(); .

    La fonction g_timeout_add() te permet d'éxécuter une fonction dans un intervalle donné. Son prototype est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    guint               g_timeout_add                       (guint interval,
                                                             GSourceFunc function,
                                                             gpointer data);
    Cette fonction renvoie un entier qu'il faut sauvegarder. Il te permettra le moment venu d'arrêter l'appel de la fonction. La doc officielle tant dira plus ici.

  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
    Citation Envoyé par kenshi240683 Voir le message
    Si tu pouvais me donner en gros la façon d'utiliser le g_timeout_add() dans mon cas car j'arrive à afficher l'heure, il me reste juste à l'actualiser à intervalle de temps réguliers.
    Il doit y avoir un bon paquet d'exemple d'utilisation de cette fonction sur le forum, c'est meme mentionne dans la FAQ http://gtk.developpez.com/faq/?page=...OUCLE_interval

  16. #16
    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
    Histoire d'apporter un peu plus comme tu utilises la libglade tu peux caster dans ta fonction le gpointer data comme ca par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkWidget *widget=(GtkWidget*)data;

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Au temps pour moi, j'ai répondu un peu vite pour le g_signal_connect_spawned(); .

    La fonction g_timeout_add() te permet d'éxécuter une fonction dans un intervalle donné. Son prototype est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    guint               g_timeout_add                       (guint interval,
                                                             GSourceFunc function,
                                                             gpointer data);
    Cette fonction renvoie un entier qu'il faut sauvegarder. Il te permettra le moment venu d'arrêter l'appel de la fonction. La doc officielle tant dira plus ici.
    En fait, je me suis mal exprimé. Je mets l'appel à g_timeout_add() à quel endroit dans mon programme ?
    J'ai quatres fichiers:
    callbacks.c --> contient les fonctions de callbacks comme son nom l'indique
    interface.c --> contient l'interface (les objets , les connections avec les signaux, ....)
    main.c --> prog principal
    support.c --> contient les fonctions utilisé dans le main

  18. #18
    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
    Je dirai une fois que ton interface est affichée. Donc juste aprés gtk_widget_show_all();

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Je dirai une fois que ton interface est affichée. Donc juste aprés gtk_widget_show_all();
    Ben apparamment ce n'était pas ça !! J'ai trouvé la solution:
    En fait j'ai modifié la fonction ma fonction de callback comme ci-dessous :
    Code C : 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
     
    void maj(gpointer data)
    {
    	//Déclarations
    	char date[14];
    	//	char info[13];
    	int fmtRc;
    	time_t calTime;
    	struct tm * locTime;
    	int i=0;
    	char c;
    	guint timer;
     
    	// On récupère la date et l'heure système
    	calTime = time(NULL);
    	locTime = localtime(&calTime);
     
    	// On formate
    	fmtRc = strftime(date,14," %d%H%MZ%b%y",locTime); 
    	//fmtRc = strftime(date,19,"  %d %m %y - %H:%M",locTime); 
     
    	// On met en majuscule
    	while (date[i])
    	{
    		c=date[i];
    		date[i]=toupper(c);
    		i++;
    	}
     
    	// On enlève le premier message puis on mets celui que l'on veut afficher
    	gtk_statusbar_pop(GTK_STATUSBAR (data), gtk_statusbar_get_context_id (GTK_STATUSBAR (data),"date")); 
    	gtk_statusbar_push (GTK_STATUSBAR (data), gtk_statusbar_get_context_id (GTK_STATUSBAR (data),"date"),date);
     
    	timer=g_timeout_add (60000,maj,data);
    }
     
    void
    on_fen_Operationnel_show               (GtkWidget       *widget,
                                            gpointer         user_data)
    {
    	maj(widget);
    }

    Et voilà !! Le tour est joué. Merci de votre aide

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 23/07/2002, 14h33
  2. soustraire deux dates ?
    Par joejoe dans le forum SQL
    Réponses: 2
    Dernier message: 19/07/2002, 15h53
  3. Generation d'evenements a une date precise
    Par pascalzzz dans le forum MFC
    Réponses: 2
    Dernier message: 04/06/2002, 15h21
  4. Réponses: 3
    Dernier message: 06/05/2002, 18h24
  5. Réponses: 3
    Dernier message: 19/04/2002, 00h11

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