怎么样学会开发gtk/glade程序?
怎么样学会开发gtk/glade程序?
菜单构件(menu)
这一节我们是这样设计的:单击主窗口菜单“文件”下的“打开”子菜单,会弹出一个新窗口。
菜单构件的使用比较简单,只要设计好后,在callbacks.c文件中找到“相应菜单”对应的“函数”,
在里面添加代码就可以了。
我们设计的主菜单有两项,“文件”和“编辑”。“文件”下有:“打开”、“保存”。“编辑”下有:“拷贝”、“粘贴”。
创建菜单构件:
/* 创建菜单构件要用到较多的函数,所辛,Glade会自动生成代码。我们不用管它了*/
这一节用到的新函数:
无
一、用Glade设计界面
步骤:1、新建glade工程
2、依此放置 窗口(400,300)、固定位置、菜单构件。
3、选中菜单构件,然后在“属性”面版中,单击“编辑菜单”按钮,编辑菜单。
4、编辑菜单时主意:菜单的标签可以使用汉字,菜单的名子要使用英文,否则生成的代码中,
你根本就看不出谁是谁。
5、在工程中,再放置一个窗口构件,在新窗口上放置标签,label属性是“window2”。
6、保存工程,并生成代码。
二、修改代码
callbacks.h /**/ voidon_open1_activate (GtkMenuItem *menuitem, gpointer user_data); voidon_save1_activate (GtkMenuItem *menuitem, gpointer user_data); voidon_copy1_activate (GtkMenuItem *menuitem, gpointer user_data); voidon_pause1_activate (GtkMenuItem *menuitem, gpointer user_data); callbacks.c void on_open1_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget *window2; window2 = create_window2 (); gtk_widget_show (window2); } void on_save1_activate (GtkMenuItem *menuitem, gpointer user_data) { } void on_copy1_activate (GtkMenuItem *menuitem, gpointer user_data) { } void on_pause1_activate (GtkMenuItem *menuitem, gpointer user_data) { }对范围构件的原代码做一些修复.
interface.c
将 /* GtkWidget *all_label1;*/ 的注释去掉.
callbacks.h
将 GtkWidget *all_label1; 删除.
callbacks.c
在函数 on_hscrollbar1_value_changed 里加上下面一句代码,加在第一行.
GtkWidget *all_label1 = lookup_widget (GTK_WIDGET(range), "all_label1");
在函数 on_vscrollbar1_value_changed 里加上下面一句代码,加在第一行.
GtkWidget *all_label1 = lookup_widget (GTK_WIDGET(range), "all_label1");
这样就可以了.
TextView构件
我们是这样设计的:在窗口上放置一个按钮构件和一个TextView构件,
单击按钮构件,在TextView构件里显示格式话的文本。
TextView构件是这样使用的:TextView构件要和TextBuffer构件结合使用。
在TextBuffer构件里定义并存储“格式化的文本”,然后在TextView构件里
显示出来。
所以使TextView构件显示格式化的文本需要三个步骤:
1、定义“格式化文本”(在TextBuffer里)。
2、存储“格式化文本”(在TextBuffer里)。
3、显示“格式化文本”(在TextView里)
这一节里:定义“格式化文本”,写了一个单独的函数create_tags,
存储“格式化文本”,写了一个单独的函数insert_text,
一、用Glade设计界面,给按钮构件添加clicked信号响应。
二、添加代码。
callbacks.c /*函数:定义格式化文本*/ static void create_tags (GtkTextBuffer *buffer) { gtk_text_buffer_create_tag (buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL); gtk_text_buffer_create_tag (buffer, "blue_foreground", "foreground", "blue", NULL); gtk_text_buffer_create_tag (buffer, "red_background", "background", "red", NULL); /* 参数的含义: "red_background" ,格式化文本的名字。"background", "red", 格式化文本的属性。 */ } /*函数:存储格式化文本*/ static void insert_text (GtkTextBuffer *buffer) { GtkTextIter iter; GtkTextIter start, end; gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0); gtk_text_buffer_insert (buffer, &iter, "The text widget can display Richtext./n", -1); gtk_text_buffer_insert (buffer, &iter, "For example, you can have/n ", -1); gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "a blue foreground /n", -1, "blue_foreground", NULL); gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "a red background /n /n", -1, "red_background", NULL); /* 参数的含义:"a red background /n /n", 要显示的文本。"red_background", 格式化文本的名字。 */ } void on_button1_clicked (GtkButton *button, gpointer user_data) { GtkWidget *textview1 = lookup_widget (GTK_WIDGET(button), "textview1"); GtkTextBuffer *buffer; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(textview1)); create_tags (buffer); insert_text (buffer); }
TreeView构件
Treeview构件的使用,需要三个构件的支持.或者说,Treeview构件和其它三个构件结合在一起才能使用.
这三个构件连同treeview是:
GtkTreeModel
GtkCellRenderer
GtkTreeViewColumn
GtkTreeView
TreeView构件的使用是相当灵活的,它可以,以列表的形式显示数据,
也可以,以树形的形式使用显示数据.
还可以对显示出来的数据,进行各种灵活的操作.
好多功能,以后慢慢捉摸吧!
这一节,我们讲述它的最简单的功能:以列表的形式显示数据.
是这样设计的:单击按钮,在TreeView构件中以列表的形式显示数据。
一、用Glade设计界面。
依此放置window构件,垂直框构件(放置的时候设置为两行),
然后在垂直框的第一行,放置按钮构件。
在第二行,放置TreeView构件。
生成代码。
二、编写代码
callbacks.c /*定义数据结构*/ typedef struct { const gchar *id; const gchar *name; const gchar *address; } telman; enum { COLUMN_ID, COLUMN_NAME, COLUMN_ADDRESS, NUM_COLUMNS }; /*添加数据*/ static telman data[] = { {"001","cuigf","china"},{"002","home","shanxi"},{"003","",""}, }; /*设置TreeView构件的模式*/ static GtkTreeModel * create_model (void) { gint i = 0; GtkListStore *store; GtkTreeIter iter; /* create list store */ store = gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); /* add data to the list store */ for (i = 0; i < G_N_ELEMENTS (data); i++) { gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, COLUMN_ID, data[i].id, COLUMN_NAME, data[i].name, COLUMN_ADDRESS, data[i].address, -1); } return GTK_TREE_MODEL (store); } /*往TreeView构件里添加列*/ static void add_columns (GtkTreeView *treeview) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("ID", renderer, "text", COLUMN_ID, NULL); gtk_tree_view_append_column (treeview, column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("NAME", renderer, "text", COLUMN_NAME, NULL); gtk_tree_view_append_column (treeview, column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("ADDRESS", renderer, "text", COLUMN_ADDRESS, NULL); gtk_tree_view_append_column (treeview, column); } void on_button1_clicked (GtkButton *button, gpointer user_data) { GtkWidget *treeview1 = lookup_widget (GTK_WIDGET(button), "treeview1"); GtkTreeModel *model; model = create_model (); gtk_tree_view_set_model(GTK_TREE_VIEW(treeview1),model); g_object_unref (model); add_columns (GTK_TREE_VIEW (treeview1)); }