gtk-back button does not remove from grid, liststo

2019-07-25 09:03发布

I have 2 concerns:

  1. in a page when I click the list item another list with a button is added to grid, but when I press button, the 1st page comes back, but the back button is not removed from grid.

  2. list store items are not shown in full, it is truncated.

How do I show the full list?

#include <gtk/gtk.h>
#include <glib.h>
#include <stdlib.h>
GtkWidget *scrolledwindow;
struct param
{
    GtkWidget* grid;
    GtkWidget* scrolledwindow;
    GtkWidget*newChild;
    GtkWidget*oldChild;
};
GtkWidget * init_tree();
GtkWidget * init_tree2();
static void destroy(GtkWidget *widget, gpointer data)
{
  gtk_main_quit();
}

static void Back (GtkButton *button, gpointer   user_data)
{
      struct param* parameters = (struct param*)user_data;
      gtk_container_remove(GTK_CONTAINER(parameters->scrolledwindow), parameters->oldChild);
      gtk_container_add(GTK_CONTAINER(parameters->scrolledwindow), parameters->newChild);
      gtk_grid_remove_row (GTK_GRID (parameters->grid),20);
      gtk_widget_show_all (GTK_WIDGET(parameters->scrolledwindow));
      gtk_widget_show_all (GTK_WIDGET(parameters->grid));


}


static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
{
      struct param* parameters = (struct param*)user_data;
      //gtk_grid_insert_row ( GTK_GRID(grid),2);
      gtk_container_remove(GTK_CONTAINER(parameters->scrolledwindow), GTK_WIDGET(tree_view));
      gtk_container_add(GTK_CONTAINER(parameters->scrolledwindow), parameters->newChild);
      GtkWidget *button = gtk_button_new_with_label ("Back");
      gtk_grid_attach (GTK_GRID (parameters->grid), button, 0, 20, 2, 2);
      parameters->oldChild = parameters->newChild;
      parameters->newChild= init_tree();
      g_signal_connect (button, "clicked", G_CALLBACK (Back), parameters);
      gtk_widget_show_all (GTK_WIDGET(parameters->scrolledwindow));
      gtk_widget_show_all (GTK_WIDGET(parameters->grid));
}

GtkWidget * init_tree()
{

    GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING);
    GtkTreeIter treeiter;

    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Mandriva", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Mandriva", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);
 GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));

    GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new();

    GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("Distributions",
                                                                                 cellrenderertext,
                                                                                 "text", 0,
                                                                                 NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn);

    return treeview;
}

GtkWidget * init_tree2()
{

    GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING);
    GtkTreeIter treeiter;

    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "a", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "b", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "c", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "d", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "e", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "f", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);

gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);

 GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));

    GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new();

    GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("Distributions",
                                                                                 cellrenderertext,
                                                                                 "text", 0,
                                                                                 NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn);

    return treeview;
}

int main(int argc, char *argv[])
{
  gtk_init(&argc, &argv);

  GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
  g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL);

  GtkWidget *notebook = gtk_notebook_new();
  gtk_container_add(GTK_CONTAINER(window), notebook);


  int count;
  gchar *text;

  for (count = 1; count <= 5; count++)
    {
      GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
      text = g_strdup_printf("Page %d", count);
      GtkWidget *label = gtk_label_new(text);
      GtkWidget* grid = gtk_grid_new ();
      GtkWidget *scrolledwindow = gtk_scrolled_window_new(NULL, NULL);

      gtk_widget_set_size_request(scrolledwindow, -1, 200);

      gtk_container_add(GTK_CONTAINER(vbox), grid/*scrolledwindow*/);

      //gtk_container_add(GTK_CONTAINER(grid), scrolledwindow);
      gtk_grid_attach (GTK_GRID (grid), scrolledwindow, 0, 0, 200, 10);
      //GtkWidget *textview = gtk_text_view_new();
      /* gtk_container_add(GTK_CONTAINER(scrolledwindow), textview); */
      GtkWidget* treeview = init_tree();
      GtkWidget* treeview2 = init_tree2();
      struct param* parameters = malloc(sizeof(struct param));
      parameters->scrolledwindow = scrolledwindow;
      parameters->grid = grid;
      parameters->newChild= treeview2;
      g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab), (gpointer)parameters);
      gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview);

      gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
    }

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

标签: c linux list gtk
1条回答
贼婆χ
2楼-- · 2019-07-25 09:24

First of all, the code is not good but that is not the question, so, to solve the specific problem of implementing a back button while showing a second treeview inside the same notebook page you can reuse the vbox that contains the treeview and add a button below it. You must set the no-show-all property to true and set the show/hide status by yourself. Basically, you want to show it only while showing the second treeview.

I've used GtkBox pack functions and within the callbacks, show and hide the back button.

Try your code with these minor tweaks:

#include <gtk/gtk.h>
#include <glib.h>
#include <stdlib.h>
GtkWidget *scrolledwindow;
struct param
{
    GtkWidget* backbutton;
    GtkWidget* scrolledwindow;
    GtkWidget*newChild;
    GtkWidget*oldChild;
};
GtkWidget * init_tree();
GtkWidget * init_tree2();
static void destroy(GtkWidget *widget, gpointer data)
{
  gtk_main_quit();
}

static void Back (GtkButton *button, gpointer   user_data)
{
      struct param* parameters = (struct param*)user_data;
      gtk_widget_hide(GTK_WIDGET(parameters->scrolledwindow));
      gtk_container_remove(GTK_CONTAINER(parameters->scrolledwindow), GTK_WIDGET(parameters->newChild));
      gtk_container_add(GTK_CONTAINER(parameters->scrolledwindow), parameters->oldChild);
      gtk_widget_hide (GTK_WIDGET(parameters->backbutton));
      gtk_widget_show_all (GTK_WIDGET(parameters->scrolledwindow));
}


static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
{
      struct param* parameters = (struct param*)user_data;
      gtk_widget_hide(GTK_WIDGET(parameters->scrolledwindow));
      gtk_container_remove(GTK_CONTAINER(parameters->scrolledwindow), GTK_WIDGET(tree_view));
      gtk_container_add(GTK_CONTAINER(parameters->scrolledwindow), parameters->newChild);
      gtk_widget_show (GTK_WIDGET(parameters->backbutton));
      gtk_widget_show_all (GTK_WIDGET(parameters->scrolledwindow));
}

GtkWidget * init_tree()
{

    GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING);
    GtkTreeIter treeiter;

    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Mandriva", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Mandriva", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);
    GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));

    GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new();

    GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("Distributions",
                                                                                 cellrenderertext,
                                                                                 "text", 0,
                                                                                 NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn);

    return treeview;
}

GtkWidget * init_tree2()
{

    GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING);
    GtkTreeIter treeiter;

    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "a", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "b", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "c", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "d", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "e", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "f", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);

    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);

    GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));

    GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new();

    GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("Distributions",
                                                                                 cellrenderertext,
                                                                                 "text", 0,
                                                                                 NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn);

    return treeview;
}

int main(int argc, char *argv[])
{
  gtk_init(&argc, &argv);

  GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
  g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL);

  GtkWidget *notebook = gtk_notebook_new();
  gtk_container_add(GTK_CONTAINER(window), notebook);


  int count;
  gchar *text;

  for (count = 1; count <= 5; count++)
    {
      text = g_strdup_printf("Page %d", count);
      GtkWidget *label = gtk_label_new(text);

      GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
      GtkWidget *scrolledwindow = gtk_scrolled_window_new(NULL, NULL);

      GtkWidget *backbutton = gtk_button_new_with_label ("Back");
      gtk_widget_set_no_show_all (backbutton, TRUE);

      gtk_box_pack_start (GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0);
      gtk_box_pack_end (GTK_BOX(vbox), backbutton, FALSE, FALSE, 0);


      GtkWidget* treeview = init_tree();
      GtkWidget* treeview2 = init_tree2();
      struct param* parameters = malloc(sizeof(struct param));
      parameters->backbutton = backbutton;
      parameters->scrolledwindow = scrolledwindow;
      parameters->oldChild= treeview;
      parameters->newChild= treeview2;

      g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab), (gpointer) parameters);
      g_signal_connect(backbutton, "clicked", G_CALLBACK(Back), (gpointer) parameters);

      gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview);
      gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
    }

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

Your Widget packaging its not good. I would suggest you try Glade and use it as a playground to learn about widget placement.

Also learn about GtkStack which would fit this purpose much better and even add "cool" animated transitions.

查看更多
登录 后发表回答