gtk-back按钮不会从网格中删除,liststore treeview行不会显示完整 [英] gtk-back button does not remove from grid, liststore treeview row is not shown full

查看:142
本文介绍了gtk-back按钮不会从网格中删除,liststore treeview行不会显示完整的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个顾虑:在一个页面当我点击列表项目时,一个按钮被添加到另一个列表中,并添加到


  1. 网格,但是当我按下按钮时,第一页返回,但返回按钮不会从网格中删除。


  2. 列表存储项不会全部显示,它被截断。


如何显示完整列表?

  #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();

$ b 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));




$ b static void replace_tab(GtkTreeView * tree_view,GtkTreePath * path,GtkTreeViewColumn *列,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);

返回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);

返回treeview;

$ b $ 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; (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();

返回0;


解决方案

首先,代码不好,但这不是问题,因此,解决在实现后退按钮时显示第二个 treeview 的特定问题笔记本页面,您可以重复使用包含 treeview vbox ,并在其下方添加一个按钮。您必须将 no-show-all 属性设置为true并自行设置显示/隐藏状态。基本上,您只想在显示第二个 treeview 时显示它。



我已经使用了 GtkBox 包函数,并在回调中显示和隐藏后退按钮。



尝试使用以下小小调整代码:

  #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();

$ b 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);

返回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);

返回treeview;

$ b $ 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; (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;
参数 - > 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();

返回0;
}

你的Widget包装不好。我建议您尝试 Glade ,并将其用作操场来了解小部件放置。



还要了解 GtkStack ,适合这个目的更好,甚至添加酷的动画过渡。


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;
}

解决方案

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.

这篇关于gtk-back按钮不会从网格中删除,liststore treeview行不会显示完整的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆