Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/06/2014, à 22:36

nexus66

[Résolu] C/GTK+ 2.0 : invalid cast from 'GtkButton' to 'GtkEntry'

Mes salutations.
J'essaie d'apprendre la programmation en C/GTK+2.0 et j'ai rencontré une erreur qui m'est apparu difficile de la résoudre seul, c'est pourquoi je me suis retourner vers vous chère communauté du libre.
Voilà le code que j'essaie de développer :

#include <stdlib.h>
#include <gtk/gtk.h>
void activer(GtkWidget *entry,gpointer data);
void copier(GtkWidget *button,gpointer data);
int main(int argc, char **argv)
  {
	  gtk_init(&argc,&argv);
	  GtkWidget *window;
	  GtkWidget *label;
	  GtkWidget *table;
	  GtkWidget *button[2];
	  GtkWidget *entry;
	  
	  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	  gtk_window_set_default_size(GTK_WINDOW(window),300,300);
	  gtk_window_set_title(GTK_WINDOW(window),"Les entrées avec table !");
	  g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
	  
	  table = gtk_table_new(3,2,TRUE);
	  gtk_container_add(GTK_CONTAINER(window),GTK_WIDGET(table));
	  
	  entry = gtk_entry_new();
	  gtk_table_attach(GTK_TABLE(table),entry,0,2,0,1,GTK_EXPAND|GTK_FILL,GTK_EXPAND,0,0);
	  
	  label = gtk_label_new(NULL);
	  gtk_table_attach(GTK_TABLE(table),label,0,2,0,2,GTK_EXPAND|GTK_FILL,GTK_EXPAND,0,0);
	  
	  button[0] = gtk_button_new_with_label("Copier");
	  button[1] = gtk_button_new_with_label("Quitter");
	  g_signal_connect(G_OBJECT(button[1]),"clicked",G_CALLBACK(gtk_main_quit),NULL);
	  
	  gtk_table_attach(GTK_TABLE(table),button[0],0,1,1,3,GTK_EXPAND|GTK_FILL,GTK_EXPAND,0,0);
	  gtk_table_attach(GTK_TABLE(table),button[1],1,2,1,3,GTK_EXPAND|GTK_FILL,GTK_EXPAND,0,0);
	  
	  g_signal_connect(G_OBJECT(button[0]),"clicked",G_CALLBACK(copier),(GtkWidget*)table);
	  g_signal_connect(G_OBJECT(entry),"activate",G_CALLBACK(activer),(GtkWidget*)label);
	  
	  
	  
      gtk_widget_show_all(window);
      gtk_main();
      return EXIT_SUCCESS;
  }
  
  void activer(GtkWidget *entry,gpointer data)
    {
		const gchar *text;
		text = gtk_entry_get_text(GTK_ENTRY(entry));
		gtk_label_set_text(GTK_LABEL((GtkWidget*)data),text);
	}
	
	void copier(GtkWidget *button,gpointer data)
	{
		GtkWidget *tempentry;
		GtkWidget *templabel;
		GList *list;
		const gchar *text;
		
		list = gtk_container_get_children(GTK_CONTAINER((GtkWidget*)data));
		tempentry = GTK_WIDGET(list->data);
		list = g_list_next(list);
		list = g_list_next(list);
		templabel = GTK_WIDGET(list->data);
		text = gtk_entry_get_text(GTK_ENTRY(tempentry));
		gtk_label_set_text(GTK_LABEL(templabel),text);
	}

La compilation se fait sans aucun problème. La fenêtre apparaît et quand j'écris un truc et j'appui sur "Entrer" l'affichage se fait correctement (ce qui signifie que la procédure "activer" est correcte). Mais quand je clic que le bouton "Copier" je reçois une erreur qui me dit :

(a.out:9518): GLib-GObject-WARNING **: invalid cast from 'GtkButton' to 'GtkEntry'

(a.out:9518): Gtk-CRITICAL **: IA__gtk_entry_get_text: assertion 'GTK_IS_ENTRY (entry)' failed

Selon-vous où est la faute dans mon code ?
Merci pour votre aide smile

Dernière modification par nexus66 (Le 25/06/2014, à 03:58)


Un jour on vivra dans un monde libre sans argent et sans banques.
Tout le monde s'adhérera à l'Open Source et le partage sera la devise de toute personne.

Hors ligne

#2 Le 23/06/2014, à 21:12

grim7reaper

Re : [Résolu] C/GTK+ 2.0 : invalid cast from 'GtkButton' to 'GtkEntry'

Salut,

Et bien le message est explicite : tu essayes de convertir un GtkButton en GtkEntry.
Dans ce bout de code :

		tempentry = GTK_WIDGET(list->data);
		list = g_list_next(list);
		list = g_list_next(list);

Au final tu dois pointer sur un des boutons et non pas sur la zone de texte.

Personnellement, je m'y serait pris autrement.
C’est le bouton qui déclenche l’action, mais il a besoin de contexte pour faire son travail. Du coup, la façon propre serait d’ajouter ce contexte au bouton.
Ce qui donnerait pour main :

    g_object_set_data(G_OBJECT(button[0]), "entry", entry);
    g_object_set_data(G_OBJECT(button[0]), "label", label);
    g_signal_connect(G_OBJECT(button[0]), "clicked", G_CALLBACK(copier), NULL);

Et pour copier :

void copier(GtkWidget *button, gpointer data)
{
    GtkEntry *entry   = g_object_get_data (G_OBJECT(button), "entry");
    GtkLabel *label   = g_object_get_data (G_OBJECT(button), "label");
    const gchar *text = gtk_entry_get_text(entry);
    gtk_label_set_text(label, text);
}

Sinon, petite question : pourquoi GTK2 au lieu de GTK3 ?

Hors ligne

#3 Le 25/06/2014, à 03:57

nexus66

Re : [Résolu] C/GTK+ 2.0 : invalid cast from 'GtkButton' to 'GtkEntry'

Merci bien grim7reaper le bouton marche parfaitement.
Mais si vous avez la gentillesse de me corriger si j'ai tord sur que j'ai pu comprendre de ton code :
Le fait d'appliquer

g_object_set_data(G_OBJECT(button[0]), "entry", entry);
    g_object_set_data(G_OBJECT(button[0]), "label", label);

permet d'attribuer au bouton button[0] la fonctionnalité et le contenu du pointeur entry (qui est un GtkWidget *) et aussi lui appliquer en même temps la fonctionnalité et le contenu du pointeur label (qui est aussi un GtkWidget*).
Ensuite dans la procédure copier, le fait d'appliquer :

GtkEntry *entry   = g_object_get_data (G_OBJECT(button), "entry");
    GtkLabel *label   = g_object_get_data (G_OBJECT(button), "label");

permet de saisir les données stockées dans la GtkWidget *button initiée dans la fonction copier, puisque ce dernier a eu le type d'un entry et d'un label en même temps?


Sinon pourquoi la GTK2 au lieu de GTK3, parce que en premier lieu je veux créer mon propre bureau gnome 2 avec ses petits widgets et ses fonctionnalités (un travail d'amateur qui veut développer ses compétences) et parce que je crois que si je maîtrise la GTK2 je pourrai passer à la GTK3 avec plus de facilité et souplesse (enfin je crois ceci).

Je vais mettre le sujet comme résolu et j'attend ta réponse impatiemment . Merci encore une fois.

Dernière modification par nexus66 (Le 25/06/2014, à 03:59)


Un jour on vivra dans un monde libre sans argent et sans banques.
Tout le monde s'adhérera à l'Open Source et le partage sera la devise de toute personne.

Hors ligne

#4 Le 25/06/2014, à 13:13

grim7reaper

Re : [Résolu] C/GTK+ 2.0 : invalid cast from 'GtkButton' to 'GtkEntry'

En fait c'est bien plus simple que ça.
Chaque objet a une table (tableau associatif) où tu peux ajouter des pointeurs (associés à des chaînes de caractères).

Donc là je fais juste en sorte que mon GtkButton garde une référence sur le GtkEntry et le GtkLabel pour pouvoir y accéder plus tard.
Le GtkButton ne devient pas pas un GtkEntry, il garde juste une référence dessus pour un accès ultérieur.

Je ne sais pas si c'est bien clair.

Dernière modification par grim7reaper (Le 25/06/2014, à 13:13)

Hors ligne

#5 Le 25/06/2014, à 22:17

nexus66

Re : [Résolu] C/GTK+ 2.0 : invalid cast from 'GtkButton' to 'GtkEntry'

Oui c'est clair big_smile
Merci bien grim7reaper


Un jour on vivra dans un monde libre sans argent et sans banques.
Tout le monde s'adhérera à l'Open Source et le partage sera la devise de toute personne.

Hors ligne