第56页的gtk+编程例子——列表框2树状

主要是参考官方文档的hello_world例子:https://docs.gtk.org/gtk3/treeview-tutorial.html

以下gtk+编程例子是来自书籍《实用技术:开发Linux应用——用GTK+和GDK开发Linux图形用户界面应用》第56页的内容——列表框,书中的gtk_list已经被gtk_tree_view替代了,这是最复杂的控件,将gtk_list_store改为gtk_tree_store,gtk_tree_store_append (store, &child, &parent);其中&child位置一定要在&parent的前面,child表示子项,parent表示父项

在openSUSE-Leap-15.3-DVD-x86_64的gnome3.34.7桌面环境下编译的,其中pkg-config --cflags --libs gtk±3.0两边有反引号括起来的
ruhong@localhost:~/gtk> gcc page562.c -o page562 pkg-config --cflags --libs gtk±3.0
ruhong@localhost:~/gtk> ./page562

/* the example on page 562 */

/* https://developer.gimp.org/api/2.0/gtk/GtkListItem.html
The GtkListItem widget is used for each item in a GtkList.
GtkList has has been deprecated since GTK+ 2.0 and should not be used in newly written code. Use GtkTreeView instead.  */

#include <gtk/gtk.h>
/* 准备材料,自定义函数  */
	/*  comments注释  */
enum {
	COLUMN_COUNTRY,
	COLUMN_COMPANY,
	COLUMN_NAME,
	NUM_COLUMNS
	/*  NUM_COLUMNS是指列数,本程序只有3列,所以它的值是3 */
	};

static GtkTreeModel *create_and_fill_model (void)
{
	GtkTreeStore *store = gtk_tree_store_new (3, G_TYPE_STRING, G_TYPE_STRING,G_TYPE_STRING);
/* 数字3是指3列,瑞典、爱立信和Ericsson都是文本字符串,类型都是是G_TYPE_STRING,函数名称GtkListStore变为GtkTreeStore */
	GtkTreeIter child, parent;
	/* 声明变量child和parent为迭代器 */
	gtk_tree_store_append (store, &parent, NULL);
	/* 可以理解为在数据库store中创建一个空行parent,函数名称gtk_list变为gtk_tree */
	gtk_tree_store_set (store, &parent, COLUMN_COUNTRY, "国外", -1);
	/* 可以理解为在空行parent写入数据,函数名称gtk_list变为gtk_tree */
	gtk_tree_store_append (store, &child, &parent);
	/* 可以理解为在数据库store中的parent中创建一个空行child,child表示子项,parent表示父项,其中&child位置一定要在&parent的前面 */
	gtk_tree_store_set (store, &child, COLUMN_COUNTRY, "瑞典", COLUMN_COMPANY, "爱立信", COLUMN_NAME, "Ericsson", -1);
	/* 可以理解为在空行child写入数据*/

	gtk_tree_store_append (store, &child, &parent);
	gtk_tree_store_set (store, &child, COLUMN_COUNTRY, "芬兰", COLUMN_COMPANY, "诺基亚", COLUMN_NAME, "Nokia", -1);

	gtk_tree_store_append (store, &child, &parent);
	gtk_tree_store_set (store, &child, COLUMN_COUNTRY, "韩国", COLUMN_COMPANY, "三星", COLUMN_NAME, "SAMSUNG", -1);

	gtk_tree_store_append (store, &child, &parent);
	gtk_tree_store_set (store, &child, COLUMN_COUNTRY, "美国", COLUMN_COMPANY, "高通", COLUMN_NAME, "Qualcomm", -1);

	gtk_tree_store_append (store, &parent, NULL);
	gtk_tree_store_set (store, &parent, COLUMN_COUNTRY, "国内", -1);

	gtk_tree_store_append (store, &child, &parent);
	gtk_tree_store_set (store, &child, COLUMN_COUNTRY, "中国", COLUMN_COMPANY, "华为", COLUMN_NAME, "HuaWei", -1);

	gtk_tree_store_append (store, &child, &parent);
	gtk_tree_store_set (store, &child, COLUMN_COUNTRY, "中国", COLUMN_COMPANY, "中兴", COLUMN_NAME, "ZTE", -1);
	return GTK_TREE_MODEL (store);
}
/* 本人也不是很理解GtkTreeModel和GTK_TREE_MODEL (store) ,store与model的联系还是很难搞清 */
static GtkWidget *create_view_and_model (void)
{
	GtkWidget *view = gtk_tree_view_new ();
	/* 创建一个显示构件view */
	GtkCellRenderer *renderer;
	/* 声明变量renderer为渲染器 */
	renderer = gtk_cell_renderer_text_new ();
	/* 可以理解为创建一个新的空列renderer*/
	gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), -1, "国家", renderer, "text", COLUMN_COUNTRY, NULL);
	/* 可以理解为在空列renderer写入数据*/
	renderer = gtk_cell_renderer_text_new ();
	gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), -1, "企业", renderer, "text", COLUMN_COMPANY, NULL);

	renderer = gtk_cell_renderer_text_new ();
	gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), -1, "英文名称", renderer, "text", COLUMN_NAME, NULL);

	GtkTreeModel *model = create_and_fill_model ();
	gtk_tree_view_set_model (GTK_TREE_VIEW (view), model);
/* 这里是将数据库model与显示构件view联系起来的,参考其它例子是gtk_tree_view_get_model,究竟get_model与set_model有什么区别?  */
	g_object_unref (model);
	return view;
}

/* 程序主体 */
int main( int argc, char *argv[] )
{
	GtkWidget *window;
	/* 声明变量window为构件gtkwidget */

	gtk_init (&argc, &argv);
	/* 初始化gtk */

	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	/*  创建顶级窗口 */
	gtk_window_set_title (GTK_WINDOW (window), "通讯设备制造企业");
	/*  为窗口顶部加上标题为test gtk_tree_view  */

	g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
	/*  为窗口加上动作,当收到destroy信号,就启动gtk_main_quit事件,gtk_main_quit就是鼠标单击窗口右上角的关闭按钮就终止程序  */
	gtk_container_set_border_width (GTK_CONTAINER (window), 100);
	/*  简单的理解是将窗口变成容器,可以装入其它构件,宽度为100像数  */

	GtkWidget *view = create_view_and_model ();

	gtk_container_add (GTK_CONTAINER (window), view);
	/*  简单的理解是将view构件装入窗口容器 */

	gtk_widget_show_all (window);
	/*  显示构件窗口  */
	gtk_main ();
	/*  进入主循环,等待信号(鼠标键盘)输入  */
	return 0;
}

效果图如下
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值