GTK+中文社区(gtk.awaysoft.com)

 找回密码
 马上加入

QQ登录

只需一步,快速开始

查看: 3962|回复: 6

GtkTreeView

[复制链接]
  • TA的每日心情
    奋斗
    2016-10-11 09:20
  • 签到天数: 271 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2011-6-30 09:16:06 | 显示全部楼层 |阅读模式
    本文转载自:http://blog.csdn.net/caterpillar ... /07/14/2646689.aspx

    具體來說,也就是該範例中的createModel()內容無需改變,將GtkComboBox的相對應程式碼,換成建立GtkTreeView的程式碼,例如:

    1. [size=3]GtkWidget *treeView = gtk_tree_view_new_with_model(createModel());[/size]
    2. GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new();[size=3][/size]
    3. GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes([size=3][/size]
    4. [size=3]                            "Icon", renderer,[/size]
    5. [size=3]                              "pixbuf",PIXBUF_COL,[/size]
    6. [size=3]                             NULL);[/size]
    7. gtk_tree_view_append_column(GTK_TREE_VIEW (treeView), column);
    8. renderer = gtk_cell_renderer_text_new();
    9. column = gtk_tree_view_column_new_with_attributes(
    10.                  "Filename", renderer,
    11.                  "text", TEXT_COL,
    12.                   NULL);
    13. gtk_tree_view_append_column(GTK_TREE_VIEW (treeView), column);
    复制代码
    GtkTreeViewColumn是GtkTreeView中的列代表,可用以設定該列的內容如何繪製以及一些相關屬性,基本上以上程式片段中,gtk_tree_view_column_new_with_attributes()與gtk_tree_view_append_column()函式可以用gtk_tree_view_insert_column_with_attributes()函式來簡化,也就是可以簡化為:

    1. [size=3]GtkWidget *treeView = gtk_tree_view_new_with_model(createModel());[/size]
    2. GtkCellRenderer *[size=3]renderer = gtk_cell_renderer_pixbuf_new();[/size]
    3. gtk_tree_view_insert_column_with_attributes([size=3][/size]
    4. [size=3]        GTK_TREE_VIEW(treeView), -1, "Icon", renderer,[/size]
    5. [size=3]        "pixbuf", PIXBUF_COL,[/size]
    6. [size=3]        NULL);[/size]
    7. renderer = gtk_cell_renderer_text_new();[size=3][/size]
    8. gtk_tree_view_insert_column_with_attributes([size=3][/size]
    9. [size=3]        GTK_TREE_VIEW(treeView), -1, "Filename", renderer,[/size]
    10. [size=3]        "text", TEXT_COL,[/size]
    11. [size=3]        NULL);[/size]
    复制代码
    在GtkTreeView當中的選擇,是以為個GtkTreeSelection物件作代表,當選擇改變時,會發出"changed"的Signal,所以要連結Signal與Callback函式,可以如下進行:

    1. [size=3]GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));[/size]
    2. g_signal_connect(G_OBJECT(selection), "changed",[size=3][/size]
    3. [size=3]                G_CALLBACK(selection_changed), label);[/size]
    复制代码
    至於Callback函式的部份大同小異,您要從傳遞的GtkTreeSelection中取得GtkTreeView,從GtkTreeView中取得GtkTreeModel,再使用gtk_tree_selection_get_selected()將GtkTreeIter指向選中的列,以取得您想取得的欄位資料:

    1. [size=3]gboolean selection_changed(GtkTreeSelection *selection, GtkLabel *label) {[/size]
    2. [size=3]    GtkTreeView *treeView;[/size]
    3. [size=3]    GtkTreeModel *model;[/size]
    4. [size=3]    GtkTreeIter iter;[/size]
    5. [size=3]    gchar *active;[/size]
    6. [size=3]    treeView = gtk_tree_selection_get_tree_view(selection);[/size]
    7. [size=3]    model = gtk_tree_view_get_model(treeView);[/size]
    8. [size=3]    gtk_tree_selection_get_selected(selection, &model, &iter);[/size]
    9. [size=3]    gtk_tree_model_get(model, &iter,[/size]
    10. [size=3]                      1, &active,[/size]
    11. [size=3]                      -1);[/size]
    12. [size=3]    gtk_label_set_text(label, active);[/size]
    13. }[size=3][/size]
    复制代码


    下面的範例是以上說明的綜合示範:
      [li]gtk_tree_view_demo.c[/li]
    1. #include <gtk/gtk.h>
    2. enum
    3. {
    4.     PIXBUF_COL,
    5.     TEXT_COL
    6. };
    7. GtkTreeModel* createModel()
    8. {
    9.     const gchar *files[] = {"caterpillar.jpg", "momor.jpg",
    10.                             "hamimi.jpg", "bush.jpg"
    11.                            };
    12.     GdkPixbuf *pixbuf;
    13.     GtkTreeIter iter;
    14.     GtkListStore *store;
    15.     gint i;
    16.     store = gtk_list_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
    17.     for(i = 0; i < 4; i++)
    18.     {
    19.         pixbuf = gdk_pixbuf_new_from_file(files[[b]i[/b]], NULL);
    20.         gtk_list_store_append(store, &iter);
    21.         gtk_list_store_set(store, &iter,
    22.                            PIXBUF_COL, pixbuf,
    23.                            TEXT_COL, files[[b]i[/b]],
    24.                            -1);
    25.         gdk_pixbuf_unref(pixbuf);
    26.     }
    27.     return GTK_TREE_MODEL(store);
    28. }
    29. gboolean selection_changed(GtkTreeSelection *selection, GtkLabel *label)
    30. {
    31.     GtkTreeView *treeView;
    32.     GtkTreeModel *model;
    33.     GtkTreeIter iter;
    34.     gchar *active;
    35.     treeView = gtk_tree_selection_get_tree_view(selection);
    36.     model = gtk_tree_view_get_model(treeView);
    37.     gtk_tree_selection_get_selected(selection, &model, &iter);
    38.     gtk_tree_model_get(model, &iter,
    39.                        1, &active,
    40.                        -1);
    41.     gtk_label_set_text(label, active);
    42. }
    43. int main(int argc, char *argv[])
    44. {
    45.     GtkWidget *window;
    46.     GtkWidget *treeView;
    47.     GtkCellRenderer *renderer;
    48.     GtkTreeViewColumn *column;
    49.     GtkWidget *label;
    50.     GtkWidget *vbox;
    51.     GtkTreeSelection *selection;
    52.     gtk_init(&argc, &argv);
    53.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    54.     gtk_window_set_title(GTK_WINDOW(window), "GtkTreeView");
    55.     gtk_window_set_default_size(GTK_WINDOW(window), 200, 50);
    56.     treeView = gtk_tree_view_new_with_model(createModel());
    57.     renderer = gtk_cell_renderer_pixbuf_new();
    58.     column = gtk_tree_view_column_new_with_attributes(
    59.                  "Icon", renderer,
    60.                  "pixbuf", PIXBUF_COL,
    61.                  NULL);
    62.     gtk_tree_view_append_column(GTK_TREE_VIEW (treeView), column);
    63.     renderer = gtk_cell_renderer_text_new();
    64.     column = gtk_tree_view_column_new_with_attributes(
    65.                  "Filename", renderer,
    66.                  "text", TEXT_COL,
    67.                  NULL);
    68.     gtk_tree_view_append_column(GTK_TREE_VIEW (treeView), column);
    69.     label = gtk_label_new("caterpillar.jpg");
    70.     vbox = gtk_vbox_new(FALSE, 5);
    71.     gtk_box_pack_start(GTK_BOX(vbox), treeView, TRUE, TRUE, 5);
    72.     gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 5);
    73.     gtk_container_add(GTK_CONTAINER(window), vbox);
    74.     selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
    75.     g_signal_connect(G_OBJECT(selection), "changed",
    76.                      G_CALLBACK(selection_changed), label);
    77.     g_signal_connect(GTK_OBJECT(window), "destroy",
    78.                      G_CALLBACK(gtk_main_quit), NULL);
    79.     gtk_widget_show_all(window);
    80.     gtk_main();
    81.     return 0;
    82. }
    复制代码




    一個執行的結果畫面如下所示:


    有了以上的基礎,要在GtkTreeView搭配GtkTreeStore就沒什麼好解釋的了,下面這個範例,只是將範例中的createModel()函式,換成  GtkComboBox 與 GtkTreeStore中的createModel()函式,剩下的都沒有改變,也就是為GtkComboBox 與 GtkTreeStore 中的Model換上GtkTreeView的外觀顯示:
      [li]gtk_tree_view_with_tree_store.c[/li]
    1. #include <gtk/gtk.h>
    2. enum
    3. {
    4.     PIXBUF_COL,
    5.     TEXT_COL
    6. };
    7. GtkTreeModel* createModel()
    8. {
    9.     const gchar *files[] = {"caterpillar.jpg", "momor.jpg",
    10.                             "hamimi.jpg", "bush.jpg"
    11.                            };
    12.     gchar *stocks[] =
    13.     {
    14.         GTK_STOCK_DIALOG_WARNING,
    15.         GTK_STOCK_STOP,
    16.         GTK_STOCK_NEW,
    17.         GTK_STOCK_CLEAR,
    18.         GTK_STOCK_OPEN
    19.     };
    20.     gchar *stockNames[] =
    21.     {
    22.         "WARNING",
    23.         "STOP",
    24.         "NEW",
    25.         "GTK_STOCK_CLEAR",
    26.         "GTK_STOCK_OPEN"
    27.     };
    28.     GtkWidget *cellView;
    29.     GdkPixbuf *pixbuf;
    30.     GtkTreeIter iter1, iter2;
    31.     GtkTreeStore *store;
    32.     gint i, j, s;
    33.     store = gtk_tree_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
    34.     cellView = gtk_cell_view_new();
    35.     for(i = 0; i < 4; i++)
    36.     {
    37.         pixbuf = gdk_pixbuf_new_from_file(files[[b]i[/b]], NULL);
    38.         gtk_tree_store_append(store, &iter1, NULL);
    39.         gtk_tree_store_set(store, &iter1,
    40.                            PIXBUF_COL, pixbuf,
    41.                            TEXT_COL, files[[b]i[/b]],
    42.                            -1);
    43.         gdk_pixbuf_unref(pixbuf);
    44.         for(j = 0; j < 3; j++)
    45.         {
    46.             s = rand() % 5;
    47.             pixbuf = gtk_widget_render_icon(cellView, stocks[s],
    48.                                             GTK_ICON_SIZE_BUTTON, NULL);
    49.             gtk_tree_store_append(store, &iter2, &iter1);
    50.             gtk_tree_store_set(store, &iter2,
    51.                                PIXBUF_COL, pixbuf,
    52.                                TEXT_COL, stockNames[s],
    53.                                -1);
    54.             gdk_pixbuf_unref(pixbuf);
    55.         }
    56.     }
    57.     return GTK_TREE_MODEL(store);
    58. }
    59. gboolean selection_changed(GtkTreeSelection *selection, GtkLabel *label)
    60. {
    61.     GtkTreeView *treeView;
    62.     GtkTreeModel *model;
    63.     GtkTreeIter iter;
    64.     gchar *active;
    65.     treeView = gtk_tree_selection_get_tree_view(selection);
    66.     model = gtk_tree_view_get_model(treeView);
    67.     gtk_tree_selection_get_selected(selection, &model, &iter);
    68.     gtk_tree_model_get(model, &iter,
    69.                        1, &active,
    70.                        -1);
    71.     gtk_label_set_text(label, active);
    72. }
    73. int main(int argc, char *argv[])
    74. {
    75.     GtkWidget *window;
    76.     GtkWidget *treeView;
    77.     GtkCellRenderer *renderer;
    78.     GtkTreeViewColumn *column;
    79.     GtkWidget *label;
    80.     GtkWidget *vbox;
    81.     GtkTreeSelection *selection;
    82.     gtk_init(&argc, &argv);
    83.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    84.     gtk_window_set_title(GTK_WINDOW(window), "GtkTreeView");
    85.     gtk_window_set_default_size(GTK_WINDOW(window), 200, 50);
    86.     treeView = gtk_tree_view_new_with_model(createModel());
    87.     renderer = gtk_cell_renderer_pixbuf_new();
    88.     column = gtk_tree_view_column_new_with_attributes(
    89.                  "Icon", renderer,
    90.                  "pixbuf", PIXBUF_COL,
    91.                  NULL);
    92.     gtk_tree_view_append_column(GTK_TREE_VIEW (treeView), column);
    93.     renderer = gtk_cell_renderer_text_new();
    94.     column = gtk_tree_view_column_new_with_attributes(
    95.                  "Filename", renderer,
    96.                  "text", TEXT_COL,
    97.                  NULL);
    98.     gtk_tree_view_append_column(GTK_TREE_VIEW (treeView), column);
    99.     label = gtk_label_new("caterpillar.jpg");
    100.     vbox = gtk_vbox_new(FALSE, 5);
    101.     gtk_box_pack_start(GTK_BOX(vbox), treeView, TRUE, TRUE, 5);
    102.     gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 5);
    103.     gtk_container_add(GTK_CONTAINER(window), vbox);
    104.     selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
    105.     g_signal_connect(G_OBJECT(selection), "changed",
    106.                      G_CALLBACK(selection_changed), label);
    107.     g_signal_connect(GTK_OBJECT(window), "destroy",
    108.                      G_CALLBACK(gtk_main_quit), NULL);
    109.     gtk_widget_show_all(window);
    110.     gtk_main();
    111.     return 0;
    112. }
    复制代码

    一個執行的結果如下所示:


    qzuser 该用户已被删除
    发表于 2015-1-30 15:07:12 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
  • TA的每日心情
    开心
    2017-11-25 14:22
  • 签到天数: 77 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2015-12-13 09:22:33 | 显示全部楼层
    为啥图不显示出来让人看。
  • TA的每日心情
    开心
    2017-11-25 14:22
  • 签到天数: 77 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2015-12-13 09:22:39 | 显示全部楼层
    为啥图不显示出来让人看。
  • TA的每日心情
    开心
    2017-11-25 14:22
  • 签到天数: 77 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2015-12-13 09:22:41 | 显示全部楼层
    为啥图不显示出来让人看。
  • TA的每日心情
    开心
    2017-11-25 14:22
  • 签到天数: 77 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2015-12-13 09:22:44 | 显示全部楼层
    为啥图不显示出来让人看。
  • TA的每日心情
    开心
    2017-11-25 14:22
  • 签到天数: 77 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2015-12-13 09:22:54 | 显示全部楼层
    为啥图不显示出来让人看。
    *滑块验证:
    您需要登录后才可以回帖 登录 | 马上加入

    本版积分规则

    申请友链|Archiver|小黑屋|手机版|GTK+中文社区 ( 粤ICP备13080851号 )

    我要啦免费统计

    GMT+8, 2024-12-21 21:08 , Processed in 0.033074 second(s), 7 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表