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+.
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); /* ... */ } |
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);
Code C : | Sélectionner tout |
gboolean user_function (GtkWidget *, GdkEventButton *, gpointer);
É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, ...); |
Code C : | Sélectionner tout |
1 2 3 | void g_signal_emit_by_name (gpointer instance, const gchar *detailed_signal, ...); |
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 çaLes 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.