Search code examples
cgtkgtk3

How to hide a .ui file and show another .ui file in GTK+


I have a button on my window on GTK+ 3. When the button is clicked, a window from another ui file should be opened and the current window's ui should be deleted (Hide). But I don't know how to do so.I am really new to Gtk+ programming on linux. this is my .c file:

#include <gtk/gtk.h>

static void 
buttonClicked(GtkWidget *widget,
              gpointer    data)
{
//here I need to open another window and close the current one
}

int main (int   argc, char *argv[])
{
  GtkBuilder *builder;
  GObject *window;
  GObject *button;
  GError *error = NULL;

  gtk_init (&argc, &argv);

  builder = gtk_builder_new();
  if(gtk_builder_add_from_file(builder, "main-window.ui", &error) == 0)
    {
      g_printerr ("Error loading file: %s\n", error->message);
      g_clear_error (&error);
      return 1;
    }
   window = gtk_builder_get_object (builder, "window");
   g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

   button = gtk_builder_get_object (builder, "buttonOpen");
   g_signal_connect (button, "clicked", G_CALLBACK (buttonClicked), NULL);

   gtk_main ();

   return 0;
}

Solution

  • Use gtk_widget_show_all () and gtk_widget_hide ().

    #include <gtk/gtk.h>
    
    static void 
    buttonClicked(GtkWidget *widget, GObject* window)
    {
        GtkBuilder *builder;
        GObject *window2;
        GError *error = NULL;
        builder = gtk_builder_new();
        if(gtk_builder_add_from_file(builder, "second-window.ui", &error) == 0)
        {
            g_printerr ("Error loading file: %s\n", error->message);
            g_clear_error (&error);
            return;
        }
        window2 = gtk_builder_get_object (builder, "window");
        gtk_widget_show_all(GTK_WIDGET(window2));
        gtk_widget_hide(GTK_WIDGET(window));
    }
    
    int main (int   argc, char *argv[])
    {
      GtkBuilder *builder;
      GObject *window;  
      GObject *button;
      GError *error = NULL;
    
      gtk_init (&argc, &argv);
    
      builder = gtk_builder_new();
      if(gtk_builder_add_from_file(builder, "main-window.ui", &error) == 0)
        {
          g_printerr ("Error loading file: %s\n", error->message);
          g_clear_error (&error);
          return 1;
        }
       window = gtk_builder_get_object (builder, "window");
       g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    
       button = gtk_builder_get_object (builder, "buttonOpen");
       g_signal_connect (button, "clicked", G_CALLBACK (buttonClicked), window);
    
       //some widgets don't draw if their parent window was not "show alled"
       gtk_widget_show_all(GTK_WIDGET(window));
    
       gtk_main ();
    
       return 0;
    }
    

    Note that gpointer is actually a void* so you can pass to your function whatever you like.