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

FAQ GTK+Consultez toutes les FAQ

Nombre d'auteurs : 10, nombre de questions : 101, dernière mise à jour : 22 février 2018  Ajouter une question

 

Cette faq a été réalisée à partir des questions fréquemment posées sur les forums de www.developpez.com et de l'expérience personnelle des auteurs.
Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette faq ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture, L'équipe GTK+.

SommaireGObjectLes signaux (3)
précédent sommaire suivant
 

Lorsque l'on souhaite intercepter un signal, il faut passer par la fonction g_signal_connect, mais il est possible de ne lui passer qu'un seul paramètre sous la forme d'un gpointer. La solution la plus simple (sous réserve d'avoir fait un minimum de conception et d'utiliser la pensée objet), est de passer le pointeur vers l'instance de notre classe. Ensuite c'est le rôle de notre classe de proposer les champs nécessaires.

Pour être plus concret, voici un exemple avec une fenêtre qui a besoin de cacher plusieurs de ses composants lors d'un clic sur un bouton :

Code C : Sélectionner tout
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
/* Notre classe MyWindow héritant de GtkWindow */ 
typedef struct 
{ 
  GtkWindow parent; 
  
  /* Les widgets composant notre fenêtre que nous souhaitons cacher */ 
  GtkWidget *widget1; 
  Gtkwidget *widget2; 
} MyWindow; 
  
/* Notre fonction qui cache les différents éléments */ 
void hide_element (GtkWidget *sender, gpointer data) 
{ 
  /* On commence par récupérer l'instance de notre classe */ 
  MyWindow *self = data; 
  
  gtk_widget_hide (self->widget1); 
  gtk_widget_hide (self->widget2); 
} 
  
int main (int argc, char** argv) 
{ 
  MyWindow *my_window = my_window_new (); 
  
  GtkWidget *button = gtk_button_new (); 
  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (hide_element), my_window); 
  
  /* ... */ 
}

Mis à jour le 16 novembre 2006 sub_khaine

Il peut y avoir plusieurs raisons à ceux problème, mais la première chose à regarder c'est que le prototype de votre fonction de rappel correspond bien à ce que GObject attend. En effet dans la plupart des cas il s'agit de :

Code C : Sélectionner tout
void user_function (GtkWidget *, gpointer);
Mais pour le signal button-press-event, par exemple, il s'agit de :

Code C : Sélectionner tout
gboolean user_function (GtkWidget *, GdkEventButton *, gpointer);

Mis à jour le 14 mai 2007 sub_khaine

Émettre un signal permet, par exemple de simuler l'action d'un utilisateur, comme le clic sur un bouton.
Pour cela, il suffit d'appeler la fonction g_signal_emit :

Code C : Sélectionner tout
1
2
3
4
void g_signal_emit (gpointer instance, 
                                               guint signal_id, 
                                               GQuark detail, 
                                               ...);
Cependant il faut connaître l'identifiant du signal. Il est plus courant de le désigner par son nom. Dans ce cas la fonction g_signal_emit_by_name peut être utilisée :

Code C : Sélectionner tout
1
2
3
void g_signal_emit_by_name (gpointer instance, 
                                                       const gchar *detailed_signal, 
                                                       ...);

Mis à jour le 14 mai 2007 sub_khaine

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.