gtk-back按钮不会从网格中删除,liststore treeview行不会显示完整 [英] gtk-back button does not remove from grid, liststore treeview row is not shown full
问题描述
我有两个顾虑:在一个页面当我点击列表项目时,一个按钮被添加到另一个列表中,并添加到
-
网格,但是当我按下按钮时,第一页返回,但返回按钮不会从网格中删除。
-
列表存储项不会全部显示,它被截断。
如何显示完整列表?
#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:
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.
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屋!