2010-03-08
一直想选一个跨平台的gui图形库研究下去,选来选去。决定使用gtk+,觉得她简单,编程风格好,又是主流开源界面库,非常直接了当。
出于数据库应用的需要,需要一个基本的grid控件,用gtk实现还是比较容易,下面是个简单例子
说明:我是在windows xp下用vs2008下编写代码,使用gtk+ 2.18.7win32平台库编译,linux编译也成功,代码跨平台,呵呵。
#include "stdio.h"
#include "stdlib.h"
#include "iostream"
#include "gtk/gtk.h"
enum { BUY_IT = 0 , QUANTITY , PRODUCT , COLUMNS};
typedef struct
{
gboolean buy;
gint quantity;
gchar *product;
} GroceryItem;
const GroceryItem list[] =
{
{ TRUE, 1, "汤圆"},
{ TRUE, 2, "面包"},
{ FALSE, 1, "奶油"},
{ TRUE, 1, "牛奶"},
{ FALSE, 3, "Chips"},
{ TRUE, 4, "Soda1"},
{ TRUE, 5, "Soda2"},
{ TRUE, 6, "Soda3"},
{ TRUE, 7, "Soda4"},
{ TRUE, 8, "Soda5"},
{ FALSE, 0, NULL}
};
static void setup_tree_view(GtkWidget *treeview)
{
//这里在treeview中加入三列标题头
GtkCellRenderer *renderer=0;
GtkTreeViewColumn *column=0;
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Buy", renderer, "text", BUY_IT, NULL);
gtk_tree_view_column_set_resizable (column,TRUE);
gtk_tree_view_column_set_alignment (column,0.5);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Count", renderer, "text", QUANTITY, NULL);
gtk_tree_view_column_set_resizable (column,TRUE);
gtk_tree_view_column_set_alignment (column,0.5);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Product", renderer, "text", PRODUCT, NULL);
gtk_tree_view_column_set_resizable (column,TRUE);
gtk_tree_view_column_set_alignment (column,0.5);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
}
int main(int argc,char*argv[])
{
GtkWidget *window, *treeview, *scrolled_win;
GtkListStore *store;
GtkTreeIter iter;
guint i = 0;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//设定系统windows框的标题
gtk_window_set_title(GTK_WINDOW(window), g_locale_to_utf8("中文Gtkgrid",-1,0,0,0));
//设定window与系统windows之间的一个间隙为2
gtk_container_set_border_width(GTK_CONTAINER(window), 2);
//设定总框容器大小
gtk_widget_set_size_request(window, 300, 200);
//生成一个treeview
treeview = gtk_tree_view_new();
//网格线属性设置,横竖都画
gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview),GTK_TREE_VIEW_GRID_LINES_BOTH);
//生成列标题
setup_tree_view(treeview);
//设定每行的字段属性
store = gtk_list_store_new(COLUMNS, G_TYPE_BOOLEAN, G_TYPE_INT, G_TYPE_STRING);
while (list[i].product != NULL)
{
//插入一个空行
gtk_list_store_append(store, &iter);
//填写行内容
gtk_list_store_set(store, &iter, BUY_IT, list[i].buy,QUANTITY,list[i].quantity,PRODUCT,g_locale_to_utf8(list[i].product,-1,0,0,0), -1);
i++;
}
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(store));
g_object_unref(store);
//生成滚动窗口容器
scrolled_win = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
//将treeview放入滚动窗口容器
gtk_container_add(GTK_CONTAINER(scrolled_win), treeview);
//将滚动窗口放入主窗口容器
gtk_container_add(GTK_CONTAINER(window), scrolled_win);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
下面是效果图: