gtk - fermer la fenêtre de formulaire avec le bouton C
J'ai une fenêtre principale avec un menu qui ouvre une autre fenêtre. Cette fenêtre secondaire a un bouton Fermer. Ce bouton a le signal clicked connecté. Mon problème est que je ne sais pas comment fermer/détruire que de la fenêtre parent. J'ai essayé avec gtk_widget_destroy, mais une erreur s'affiche parce que la fenêtre n'est pas un gadget .... Je n'ai pas trouvé de fonction pour détruire la fenêtre parent ....
Quelqu'un peut me montrer le chemin, s'il vous plaît?
Merci à l'avance.
-----------------------------------------------
Ok. Je poste un morceau de code. Lorsque j'exécute le programme, je clique dans "fenêtre Ouverte" sur le bouton. Une nouvelle fenêtre s'ouvre avec un bouton "Fermer". Si je clique sur "Fermer" - je obtenir de l'erreur suivante dans le terminal: (Windows:13801): Gtk-CRITICAL **: gtk_widget_destroy: assertion `GTK_IS_WIDGET (widget)' failed
Le code est:
#include <stdlib.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
void open_window(GtkWidget *widget, gpointer window);
void close_window(GtkWidget *widget, gpointer window);
int main( int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *fixed;
GtkWidget *button;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Windows");
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
fixed = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), fixed);
button = gtk_button_new_with_label("Open window");
gtk_fixed_put(GTK_FIXED(fixed), button, 50, 50);
gtk_widget_set_size_request(button, 80, 35);
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(open_window), G_OBJECT(window));
g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
void open_window(GtkWidget *widget, gpointer window)
{
GtkBuilder *builder;
GtkWidget *secondWindow = NULL;
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "secondWindow.glade", NULL);
secondWindow = GTK_WIDGET (gtk_builder_get_object (builder, "secondWindow"));
gtk_builder_connect_signals (builder, NULL);
g_object_unref (G_OBJECT (builder));
gtk_window_set_modal(GTK_WINDOW(secondWindow), TRUE);
gtk_widget_show_all(secondWindow);
}
void close_window(GtkWidget *widget, gpointer window)
{
gtk_widget_destroy(GTK_WIDGET(window));
}
Dans le fichier "secondWindow.la clairière" est définie d'une fenêtre, une table et un bouton placé dans la cellule du milieu de la table. Aussi, il est défini une poignée pour la "clique" de l'événement bouton nommé "close_window".
Lien vers le fichier glade si quelqu'un veut l'exécuter: https://sites.google.com/site/marvalsiteimages/secondWindow.glade
J'espère que cela pourrait vous aider à comprendre mon problème.
Merci.
-------------------------------------------------
Code Final en fonction de la réponse:
void open_window(GtkWidget *widget, gpointer window)
{
GtkBuilder *builder;
GtkWidget *secondWindow = NULL;
GtkWidget *closeButton = NULL;
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "secondWindow.glade", NULL);
secondWindow = GTK_WIDGET (gtk_builder_get_object (builder, "secondWindow"));
closeButton = GTK_WIDGET (gtk_builder_get_object (builder, "closeWindowButton"));
g_signal_connect (G_OBJECT (closeButton),
"clicked",
G_CALLBACK (close_window),
G_OBJECT (secondWindow)); //here is the magic: the callback will get the window to close
g_object_unref (G_OBJECT (builder));
gtk_window_set_modal(GTK_WINDOW(secondWindow), TRUE);
gtk_widget_show_all(secondWindow);
}
À partir d'une expérience utilisateur point de vue, avoir un clic sur une des fenêtres secondaires de clôture, le premier semble un peu bizarre. Qu'essayez-vous de réaliser? Il peut y avoir une meilleure façon de le faire. Veuillez préciser également vous GTK version.
Par la voie, gtk_widget_destroy sur un GtkWindow devrait fonctionner, comme GtkWindow est dérivé de GtkWidget. Merci de nous montrer un peu de code.
Il est le parent de la fenêtre du bouton fermer. Donc je voudrais fermer la deuxième fenêtre avec son bouton ... pas le principal ...
Puis gtk_widget_destroy est le chemin à parcourir. Merci de nous donner un peu de code.
OriginalL'auteur NEBUC | 2012-09-27
Vous devez vous connecter pour publier un commentaire.
Votre problème est que le signal "clicked" de la touche de la deuxième fenêtre est connecté à partir du fichier glade. Mais le gestionnaire de signal a besoin d'un pointeur vers la fenêtre pour la détruire. C'est passé au travers de la "user_data" paramètre de signal de rappel.
Un moyen serait par l'adoption de la deuxième fenêtre de la user_data argument dans la Clairière (donner un coup d'oeil à ce Clairière tutoriel), mais l'argument est censé être un pointeur, et je ne sais pas comment on peut le faire avec de la clairière. MODIFIER: cliquez simplement sur le champ de données d'utilisateur associé à ce signal dans la clairière, et une fenêtre vous permettra de sélectionner l'objet à transmettre au gestionnaire de signal. Il suffit de sélectionner votre "secondWindow" objet.
Une autre façon de faire serait seulement de supprimer les de traitement de signal à partir du fichier glade, et de se connecter manuellement sur lequel vous avez cliqué signal de code, en passant un pointeur vers la deuxième fenêtre de données de l'utilisateur:
Désolé pour la mauvaise qualité du code, a écrit les modifications dans une hâte :-/. Je le fixe sur la base de vos tests, de sorte que la réponse finale apparaît ici aussi. Essayez-vous à la clairière, seule l'approche de trop. Vous êtes alors seulement limitée lorsque vous avez plusieurs paramètres à passer (dans une structure par exemple), mais il devrait fonctionner correctement dans les cas simples comme celui-ci.
OriginalL'auteur liberforce