Отправляет email-рассылки с помощью сервиса Sendsay

Практические советы по GTK+

  Все выпуски  

Практические советы по GTK+ (Создание списков. часть 1)


 Создание списков  часть 1

 Разберём создание списков.

Для примера напишем небольшое приложение,показывающее список людей.

Для начала попробуем упростить всё по максимуму.

В списке будет три столбца: порядковый номер, имя и возраст. Причём при нажатии на заголовок колонки, её содержимое будет сортироваться.

 

Раньше всё можно было создать через GtkCList, теперь GtkCList объявлен как deprecated, то есть не рекомендован к использованию во вновь создаваемых программах.Предлагают использовать взамен GtkTreeView, последуем рекомендациям.

 

Далее представлен полный исходный код приложения.

Функция создания виджета со списком: GtkWidget *create_treeview()

В основной функции main() создаётся окно и в него упаковывается созданный список.

#include <gtk/gtk.h>

// Массивы для отображения в списках
// Список людей
static char* user_names[]={"Василий","Ольга","Степан","Татьяна","Костя","Михаил","Тамара","Юля","Катя","Колян","Михалыч","Алексей"};
// Список возрастов людей
static int user_ages[]={34,21,53,67,7,23,46,32,17,73,97,33};

GtkWidget *create_treeview()
{
    int i;
    int i_max = sizeof(user_names)/sizeof(char*);// сколько всего записей в таблице
    GtkTreeView*treeview_users;
    GtkListStore*store;
    GtkTreeIteriter;
    int column_number = 0;// номер текущей колонки
    /* Создаём модель списка.
    У нас будет три столбца - первый типа INT (порядковый номер), второе текстовое(имя) и третье опять числовое(возраст) */
    store = gtk_list_store_new(3,G_TYPE_INT,G_TYPE_STRING,G_TYPE_INT);
    // Заполняем список
    for (i = 0; i < i_max; i++)
    {
        // добавляем строчку в список
        gtk_list_store_append (store, &iter);
        // заполнем добавленню строчку в списоке
        gtk_list_store_set (store, &iter,
        0, i+1,// порядковый номер
        1, user_names[i],// имя
        2, user_ages[i],// возраст
        -1);// последний элемент д.б. -1
    }
   
    // создать список(treeview) согласно модели store
    treeview_users = (GtkTreeView*)gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
    // Создать колонки в списке
    {
        GtkCellRenderer *renderer;
        GtkTreeViewColumn *column;
        // колонка - Порядковый номер;
        renderer = gtk_cell_renderer_text_new();
        column = gtk_tree_view_column_new_with_attributes ("№",renderer,"text",column_number,NULL);
        gtk_tree_view_append_column (treeview_users, column);// вставляем колонку в список;
        gtk_tree_view_column_set_sort_column_id (column, column_number);// колонка сортируется;
        column_number++;
        // колонка - Имя;
        renderer = gtk_cell_renderer_text_new ();
        column = gtk_tree_view_column_new_with_attributes ("Имя",renderer,"text",column_number,NULL);
        gtk_tree_view_append_column (treeview_users, column);// вставляем колонку в список;
        gtk_tree_view_column_set_sort_column_id (column, column_number);// колонка сортируется;
        column_number++;
        // колонка - Возраст;
        renderer = gtk_cell_renderer_text_new ();
        column = gtk_tree_view_column_new_with_attributes ("Возраст",renderer,"text",column_number,NULL);
        gtk_tree_view_append_column (treeview_users, column);// вставляем колонку в список;
        gtk_tree_view_column_set_sort_column_id (column, column_number);// колонка сортируется;
        column_number++;
    }
    return GTK_WIDGET(treeview_users);
}

gint main (gint argc, gchar **argv)
{
    GtkWidget *window;
    GtkWidget *treeview;

    gtk_init (&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"Список");
    gtk_signal_connect( GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(gtk_false),NULL);
    gtk_signal_connect( GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

    treeview = create_treeview();
    gtk_container_add (GTK_CONTAINER (window),treeview);
    gtk_widget_show_all (window);
    gtk_main ();
    return 0;
}

Скриншот приложения в ОС Windows, где список отсортирован по возрасту:

(скриншот приложения)

 

В следующий раз усложним список и внесём в него нестандартные элементы.

 


В избранное