【GTK】【linux】如何使用gtk-demo里面的例程

gtk-demo中的例子都是在一个框架中的,如果想自己单拿出来运行,要添加主函数,大多如下:
  1. int
  2. main(int argc, char **argv)
  3. {
  4.         GtkWidget *window;
  5.  
  6.         gtk_init(&argc, &argv);
  7.         window = demo-入口函数(NULL);
  8.         g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  9.         gtk_main();
  10.         return 0;
  11. }
例如在"editable cells"例子中源码:
  1. #include <gtk/gtk.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. static GtkWidget *window = NULL;
  6.  
  7. typedef struct
  8. {
  9.     gint number;
  10.     gchar *product;
  11.     gint yummy;
  12. }
  13. Item;
  14.  
  15. enum
  16. {
  17.     COLUMN_ITEM_NUMBER,
  18.     COLUMN_ITEM_PRODUCT,
  19.     COLUMN_ITEM_YUMMY,
  20.     NUM_ITEM_COLUMNS
  21. };
  22.  
  23. enum
  24. {
  25.     COLUMN_NUMBER_TEXT,
  26.     NUM_NUMBER_COLUMNS
  27. };
  28.  
  29. static GArray *articles = NULL;
  30.  
  31.     static void
  32. add_items (void)
  33. {
  34.     Item foo;
  35.  
  36.     g_return_if_fail (articles != NULL);
  37.  
  38.     foo.number = 3;
  39.     foo.product = g_strdup ("bottles of coke");
  40.     foo.yummy = 20;
  41.     g_array_append_vals (articles, &foo, 1);
  42.  
  43.     foo.number = 5;
  44.     foo.product = g_strdup ("packages of noodles");
  45.     foo.yummy = 50;
  46.     g_array_append_vals (articles, &foo, 1);
  47.  
  48.     foo.number = 2;
  49.     foo.product = g_strdup ("packages of chocolate chip cookies");
  50.     foo.yummy = 90;
  51.     g_array_append_vals (articles, &foo, 1);
  52.  
  53.     foo.number = 1;
  54.     foo.product = g_strdup ("can vanilla ice cream");
  55.     foo.yummy = 60;
  56.     g_array_append_vals (articles, &foo, 1);
  57.  
  58.     foo.number = 6;
  59.     foo.product = g_strdup ("eggs");
  60.     foo.yummy = 10;
  61.     g_array_append_vals (articles, &foo, 1);
  62. }
  63.  
  64.     static GtkTreeModel *
  65. create_items_model (void)
  66. {
  67.     gint i = 0;
  68.     GtkListStore *model;
  69.     GtkTreeIter iter;
  70.  
  71.     /* create array */
  72.     articles = g_array_sized_new (FALSE, FALSE, sizeof (Item), 1);
  73.  
  74.     add_items ();
  75.  
  76.     /* create list store */
  77.     model = gtk_list_store_new (NUM_ITEM_COLUMNS, G_TYPE_INT, G_TYPE_STRING,
  78.             G_TYPE_INT, G_TYPE_BOOLEAN);
  79.  
  80.     /* add items */
  81.     for (= 0; i < articles->len; i++)
  82.     {
  83.         gtk_list_store_append (model, &iter);
  84.  
  85.         gtk_list_store_set (model, &iter,
  86.                 COLUMN_ITEM_NUMBER,
  87.                 g_array_index (articles, Item, i).number,
  88.                 COLUMN_ITEM_PRODUCT,
  89.                 g_array_index (articles, Item, i).product,
  90.                 COLUMN_ITEM_YUMMY,
  91.                 g_array_index (articles, Item, i).yummy,
  92.                 -1);
  93.     }
  94.  
  95.     return GTK_TREE_MODEL (model);
  96. }
  97.  
  98.     static GtkTreeModel *
  99. create_numbers_model (void)
  100. {
  101. #define N_NUMBERS 10
  102.     gint i = 0;
  103.     GtkListStore *model;
  104.     GtkTreeIter iter;
  105.  
  106.     /* create list store */
  107.     model = gtk_list_store_new (NUM_NUMBER_COLUMNS, G_TYPE_STRING, G_TYPE_INT);
  108.  
  109.     /* add numbers */
  110.     for (= 0; i < N_NUMBERS; i++)
  111.     {
  112.         char str[2];
  113.  
  114.         str[0] = '0' + i;
  115.         str[1] = '\0';
  116.  
  117.         gtk_list_store_append (model, &iter);
  118.  
  119.         gtk_list_store_set (model, &iter,
  120.                 COLUMN_NUMBER_TEXT, str,
  121.                 -1);
  122.     }
  123.  
  124.     return GTK_TREE_MODEL (model);
  125.  
  126. #undef N_NUMBERS
  127. }
  128.  
  129.     static void
  130. add_item (GtkWidget *button, gpointer data)
  131. {
  132.     Item foo;
  133.     GtkTreeIter iter;
  134.     GtkTreeModel *model = (GtkTreeModel *)data;
  135.  
  136.     g_return_if_fail (articles != NULL);
  137.  
  138.     foo.number = 0;
  139.     foo.product = g_strdup ("Description here");
  140.     foo.yummy = 50;
  141.     g_array_append_vals (articles, &foo, 1);
  142.  
  143.     gtk_list_store_append (GTK_LIST_STORE (model), &iter);
  144.     gtk_list_store_set (GTK_LIST_STORE (model), &iter,
  145.             COLUMN_ITEM_NUMBER, foo.number,
  146.             COLUMN_ITEM_PRODUCT, foo.product,
  147.             COLUMN_ITEM_YUMMY, foo.yummy,
  148.             -1);
  149. }
  150.  
  151.     static void
  152. remove_item (GtkWidget *widget, gpointer data)
  153. {
  154.     GtkTreeIter iter;
  155.     GtkTreeView *treeview = (GtkTreeView *)data;
  156.     GtkTreeModel *model = gtk_tree_view_get_model (treeview);
  157.     GtkTreeSelection *selection = gtk_tree_view_get_selection (treeview);
  158.  
  159.     if (gtk_tree_selection_get_selected (selection, NULL, &iter))
  160.     {
  161.         gint i;
  162.         GtkTreePath *path;
  163.  
  164.         path = gtk_tree_model_get_path (model, &iter);
  165.         i = gtk_tree_path_get_indices (path)[0];
  166.         gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
  167.  
  168.         g_array_remove_index (articles, i);
  169.  
  170.         gtk_tree_path_free (path);
  171.     }
  172. }
  173.  
  174.     static gboolean
  175. separator_row (GtkTreeModel *model,
  176.         GtkTreeIter *iter,
  177.         gpointer data)
  178. {
  179.     GtkTreePath *path;
  180.     gint idx;
  181.  
  182.     path = gtk_tree_model_get_path (model, iter);
  183.     idx = gtk_tree_path_get_indices (path)[0];
  184.  
  185.     gtk_tree_path_free (path);
  186.  
  187.     return idx == 5;
  188. }
  189.  
  190.     static void
  191. editing_started (GtkCellRenderer *cell,
  192.         GtkCellEditable *editable,
  193.         const gchar *path,
  194.         gpointer data)
  195. {
  196.     gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (editable), 
  197.             separator_row, NULL, NULL);
  198. }
  199.  
  200.     static void
  201. cell_edited (GtkCellRendererText *cell,
  202.         const gchar *path_string,
  203.         const gchar *new_text,
  204.         gpointer data)
  205. {
  206.     GtkTreeModel *model = (GtkTreeModel *)data;
  207.     GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
  208.     GtkTreeIter iter;
  209.  
  210.     gint column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
  211.  
  212.     gtk_tree_model_get_iter (model, &iter, path);
  213.  
  214.     switch (column)
  215.     {
  216.         case COLUMN_ITEM_NUMBER:
  217.             {
  218.                 gint i;
  219.  
  220.                 i = gtk_tree_path_get_indices (path)[0];
  221.                 g_array_index (articles, Item, i).number = atoi (new_text);
  222.  
  223.                 gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
  224.                         g_array_index (articles, Item, i).number, -1);
  225.             }
  226.             break;
  227.  
  228.         case COLUMN_ITEM_PRODUCT:
  229.             {
  230.                 gint i;
  231.                 gchar *old_text;
  232.  
  233.                 gtk_tree_model_get (model, &iter, column, &old_text, -1);
  234.                 g_free (old_text);
  235.  
  236.                 i = gtk_tree_path_get_indices (path)[0];
  237.                 g_free (g_array_index (articles, Item, i).product);
  238.                 g_array_index (articles, Item, i).product = g_strdup (new_text);
  239.  
  240.                 gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
  241.                         g_array_index (articles, Item, i).product, -1);
  242.             }
  243.             break;
  244.     }
  245.  
  246.     gtk_tree_path_free (path);
  247. }
  248.  
  249.     static void
  250. add_columns (GtkTreeView *treeview, 
  251.         GtkTreeModel *items_model,
  252.         GtkTreeModel *numbers_model)
  253. {
  254.     GtkCellRenderer *renderer;
  255.  
  256.     /* number column */
  257.     renderer = gtk_cell_renderer_combo_new ();
  258.     g_object_set (renderer,
  259.             "model", numbers_model,
  260.             "text-column", COLUMN_NUMBER_TEXT,
  261.             "has-entry", FALSE,
  262.             "editable", TRUE,
  263.             NULL);
  264.     g_signal_connect (renderer, "edited",
  265.             G_CALLBACK (cell_edited), items_model);
  266.     g_signal_connect (renderer, "editing-started",
  267.             G_CALLBACK (editing_started), NULL);
  268.     g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER (COLUMN_ITEM_NUMBER));
  269.  
  270.     gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  271.             -1, "Number", renderer,
  272.             "text", COLUMN_ITEM_NUMBER,
  273.             NULL);
  274.  
  275.     /* product column */
  276.     renderer = gtk_cell_renderer_text_new ();
  277.     g_object_set (renderer,
  278.             "editable", TRUE,
  279.             NULL);
  280.     g_signal_connect (renderer, "edited",
  281.             G_CALLBACK (cell_edited), items_model);
  282.     g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER (COLUMN_ITEM_PRODUCT));
  283.  
  284.     gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  285.             -1, "Product", renderer,
  286.             "text", COLUMN_ITEM_PRODUCT,
  287.             NULL);
  288.  
  289.     /* yummy column */
  290.     renderer = gtk_cell_renderer_progress_new ();
  291.     g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER (COLUMN_ITEM_YUMMY));
  292.  
  293.     gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  294.             -1, "Yummy", renderer,
  295.             "value", COLUMN_ITEM_YUMMY,
  296.             NULL);
  297.  
  298.  
  299. }
  300.  
  301.     GtkWidget *
  302. do_editable_cells (GtkWidget *do_widget)
  303. {
  304.     if (!window)
  305.     {
  306.         GtkWidget *vbox;
  307.         GtkWidget *hbox;
  308.         GtkWidget *sw;
  309.         GtkWidget *treeview;
  310.         GtkWidget *button;
  311.         GtkTreeModel *items_model;
  312.         GtkTreeModel *numbers_model;
  313.  
  314.         /* create window, etc */
  315.         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  316.         gtk_window_set_screen (GTK_WINDOW (window),
  317.                 gtk_widget_get_screen (do_widget));
  318.         gtk_window_set_title (GTK_WINDOW (window), "Shopping list");
  319.         gtk_container_set_border_width (GTK_CONTAINER (window), 5);
  320.         g_signal_connect (window, "destroy",
  321.                 G_CALLBACK (gtk_widget_destroyed), &window);
  322.  
  323.         vbox = gtk_vbox_new (FALSE, 5);
  324.         gtk_container_add (GTK_CONTAINER (window), vbox);
  325.  
  326.         gtk_box_pack_start (GTK_BOX (vbox),
  327.                 gtk_label_new ("Shopping list (you can edit the cells!)"),
  328.                 FALSE, FALSE, 0);
  329.  
  330.         sw = gtk_scrolled_window_new (NULL, NULL);
  331.         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
  332.                 GTK_SHADOW_ETCHED_IN);
  333.         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
  334.                 GTK_POLICY_AUTOMATIC,
  335.                 GTK_POLICY_AUTOMATIC);
  336.         gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
  337.  
  338.         /* create models */
  339.         items_model = create_items_model ();
  340.         numbers_model = create_numbers_model ();
  341.  
  342.         /* create tree view */
  343.         treeview = gtk_tree_view_new_with_model (items_model);
  344.         gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
  345.         gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
  346.                 GTK_SELECTION_SINGLE);
  347.  
  348.         add_columns (GTK_TREE_VIEW (treeview), items_model, numbers_model);
  349.  
  350.         g_object_unref (numbers_model);
  351.         g_object_unref (items_model);
  352.  
  353.         gtk_container_add (GTK_CONTAINER (sw), treeview);
  354.  
  355.         /* some buttons */
  356.         hbox = gtk_hbox_new (TRUE, 4);
  357.         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
  358.  
  359.         button = gtk_button_new_with_label ("Add item");
  360.         g_signal_connect (button, "clicked",
  361.                 G_CALLBACK (add_item), items_model);
  362.         gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
  363.  
  364.         button = gtk_button_new_with_label ("Remove item");
  365.         g_signal_connect (button, "clicked",
  366.                 G_CALLBACK (remove_item), treeview);
  367.         gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
  368.  
  369.         gtk_window_set_default_size (GTK_WINDOW (window), 320, 200);
  370.     }
  371.  
  372.     if (!GTK_WIDGET_VISIBLE (window))
  373.         gtk_widget_show_all (window);
  374.     else
  375.     {
  376.         gtk_widget_destroy (window);
  377.         window = NULL;
  378.     }
  379.  
  380.     return window;
  381. }
  382.  
  383.  
例如存入t_editable_cells.c中,在代码底部插入如下代码
  1. int
  2. main(int argc, char **argv)
  3. {
  4.     GtkWidget *window;
  5.  
  6.     gtk_init(&argc, &argv);
  7.     window = do_editable_cells(NULL);
  8.     g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  9.     gtk_main();
  10.     return 0;
  11. }
  1. gcc `pkg-config --libs --cflags gtk+-2.0` -o t_editable_cells t_editable_cells.c
即可
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值