怎么样学会开发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));

}