2014-01-31 2 views
1

Я хотел бы создать простую таблицу в GTK со следующим содержанием:Создание простого списка GTK

| test name | 0 | 10 | 

Я просто хочу, чтобы создать, но GTK не делает это легко. Я создал GtkListStore, который содержит всю необходимую мне информацию, но, видимо, мне также нужно создать GtkTreeViewColumn. Мне нужно передать значения gtk_tree_view_column_new_with_attributes, но проблема в том, что я не знаю никаких имен атрибутов, и я не могу их найти нигде. Единственный атрибут, который я нашел, это «текст», но я также передаю целые числа без знака. Может ли кто-нибудь сказать мне, что это за атрибуты, и как создать простую таблицу? (Я прочитал https://developer.gnome.org/gtk3/stable/TreeWidget.html кстати)

enum { FILE_NAME = 0, FILE_OFFSET, FILE_SIZE }; 

GtkWidget*   tree; 
GtkListStore*  store; 
GtkTreeIter   iter; 
GtkCellRenderer* renderer; 
GtkTreeViewColumn* column; 

store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT); 
gtk_list_store_append (store, &iter); 
gtk_list_store_set (store, &iter, FILE_NAME, "test name", FILE_OFFSET, 0, 
     FILE_SIZE, 10, -1); 

tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); 
g_object_unref (G_OBJECT (store)); 
renderer = gtk_cell_renderer_text_new(); 

column = gtk_tree_view_column_new_with_attributes ("Name", renderer, 
     "text", FILE_NAME, NULL); 
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column); 

С отправленного кода я получаю следующий результат:

| name ? | 
| test name | 
+1

вы, вероятно, следует также прочитать GtkTreeView учебник по: http://scentric.net/tutorial - это было написано для GTK + 2.x, но API GtkTreeView не изменился между 2.x и 3.x. – ebassi

ответ

4

Вы должны понять, модели и представления разделяются понятия.

GtkListStore - это модель и содержит данные для отображения. Он также может иметь кучу других данных, не необходимых для представления, например. это может быть результатом более общего SQL-запроса.

GtkTreeView это вид, и вы должны проинструктировать его о том, как представить данные на экране. Он делает это путем упаковки разных столбцов внутри прямоугольной области. Следующий пример дает представление о том, что может быть достигнуто:

#include <gtk/gtk.h> 

enum { 
    FILE_NAME, 
    FILE_OFFSET, 
    FILE_SIZE, 
    FILE_DESCRIPTION, /* Not used by the view, maybe used elsewhere */ 
    COLOR,   /* Just to show how the model can affect the view */ 
    N_COLUMNS 
}; 

gint main(gint argc, gchar **argv) 
{ 
    GtkListStore*  model; 
    GtkWidget*   view; 
    GtkTreeViewColumn* column; 
    GtkWidget*   window; 

    gtk_init(&argc, &argv); 

    /* MODEL */ 
    model = gtk_list_store_new(N_COLUMNS, 
           G_TYPE_STRING, /* FILE_NAME */ 
           G_TYPE_UINT,  /* FILE_OFFSET */ 
           G_TYPE_UINT,  /* FILE_SIZE */ 
           G_TYPE_STRING, /* FILE_DESCRIPTION */ 
           G_TYPE_STRING /* COLOR */ 
          ); 
    gtk_list_store_insert_with_values(model, NULL, -1, 
             FILE_NAME, "test name", 
             FILE_OFFSET, 0, 
             FILE_SIZE, 10, 
             -1); 
    gtk_list_store_insert_with_values(model, NULL, -1, 
             FILE_NAME, "Dummy", 
             FILE_OFFSET, 123, 
             COLOR, "black", 
             -1); 
    gtk_list_store_insert_with_values(model, NULL, -1, 
             COLOR, "blue", 
             -1); 

    /* VIEW */ 
    view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); 
    g_object_unref(model); 

    column = gtk_tree_view_column_new_with_attributes("Name", 
                 gtk_cell_renderer_text_new(), 
                 "text", FILE_NAME, 
                 "background", COLOR, 
                 NULL); 
    gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); 

    column = gtk_tree_view_column_new_with_attributes("Offset", 
                 gtk_cell_renderer_spin_new(), 
                 "text", FILE_OFFSET, 
                 NULL); 
    gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); 

    column = gtk_tree_view_column_new_with_attributes("Size", 
                 gtk_cell_renderer_text_new(), 
                 "text", FILE_SIZE, 
                 NULL); 
    gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); 

    /* MAIN */ 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_container_add(GTK_CONTAINER(window), view); 
    gtk_widget_show_all(window); 

    gtk_main(); 

    return 0; 
} 
Смежные вопросы