Привіт усім. Сьогодні я покажу як використовувати табличний віджет у GTK. По плану опис функцій і приклад простої програми.

Функції

Ієрархія конфігурації об'єктів віджета виглядає наступним чином: TreeView_hierarchy. Хоча на рисунку зображені групи примірників об'єкта GtkCellRenderer, їх не потрібно кожного разу створювати вручну — необхідно всього-лиш сконфігурувати стовпець одним примірником за допомогою функції gtk_tree_view_column_new_with_attributes, і далі вони будуть створюватись автоматично. Для того щоб створити табличний віджет, знадобляться наступні функції. gtk_tree_view_new, gtk_tree_view_new_with_model — використовуються для створення табличного віджета в GTK. Їхнє оголошення виглядає наступним чином:
GtkWidget* gtk_tree_view_new (void) ;
GtkWidget* gtk_tree_view_new_with_model (GtkTreeModel *model) ;
GtkWidget* gtk_tree_view_new (void) ;
GtkWidget* gtk_tree_view_new_with_model (GtkTreeModel *model) ;
Друга функція створює табличний віджет з вбудованим в нього представленням. gtk_list_store_new, gtk_list_store_newv — створення об'єкта спискового представлення даних у табличному віджеті. Оголошення:
GtkListStore* gtk_list_store_new (gint n_columns, ... ) ;
GtkListStore* gtk_list_store_newv (gint n_columns, GType *types) ;
n_columns — кількість колонок у представленні/віджеті; types — вказівник на масив типів колонок (G_TYPE_STRING). gtk_tree_view_set_model — встановлює представлення табличного віджета. Оголошення:
void gtk_tree_view_set_model (GtkTreeView* tree_view, GtkTreeModel* model) ;
tree_view — віджет створений за допомогою gtk_tree_view_new або gtk_tree_view_new_with_model; model — представлення табличного віджета створений за допомогою функцій gtk_list_store_new, gtk_tree_store_new або іншим аналогом. gtk_cell_renderer_text_new, gtk_cell_renderer_pixbuf_new, gtk_cell_renderer_progress_new, gtk_cell_renderer_spinner_new, gtk_cell_renderer_toggle_new — створення комірки певного типу. Оголошення:
GtkCellRenderer* gtk_cell_renderer_text_new (void) ;
GtkCellRenderer* gtk_cell_renderer_pixbuf_new (void) ;
GtkCellRenderer* gtk_cell_renderer_progress_new (void) ;
GtkCellRenderer* gtk_cell_renderer_spinner_new (void) ;
GtkCellRenderer* gtk_cell_renderer_toggle_new (void) ;
gtk_tree_view_column_new_with_attributes — використовується для створення примірника стовпця представлення. Оголошення:
GtkTreeViewColumn* gtk_tree_view_column_new_with_attributes (const gchar *title, GtkCellRenderer *cell, ...) ;
title — заголовок колонки; cell — об'єкт створений за допомогою функцій gtk_cell_renderer_text_new, gtk_cell_renderer_pixbuf_new, gtk_cell_renderer_progress_new, gtk_cell_renderer_spinner_new, gtk_cell_renderer_toggle_new. gtk_tree_view_append_column — додавання колонки до представлення даних. Оголошення:
gint gtk_tree_view_append_column (GtkTreeView* tree_view, GtkTreeViewColumn* column) ;
Повертає кількість колонок в представленні після додавання даної. tree_view — об'єкт створений за допомогою функцій gtk_tree_view_new або gtk_tree_view_new_with_model; column — об'єкт створений за допомогою gtk_tree_view_column_new_with_attributes. Для заповнення віджета даними скористуємось наступними функціями: gtk_list_store_append — додає рядок до представлення, оголошення:
void gtk_list_store_append (GtkListStore* list_store, GtkTreeIter* iter) ;
Після додавання нового рядка iter буде вказувати на новостворений рядок. gtk_list_store_set — встановлює дані рядка. Список даних повинен закінчуватись значенням -1. Для додавання даних до табличного віджета можна також скористатись функцією gtk_list_store_set_value. Оголошення:
void gtk_list_store_set (GtkListStore* list_store, GtkTreeIter* iter, ... ) ;
list_store і iter являються вказівниками на представлення і рядок у ньому відповідно.

Програма

Прикладом простої програми, яка буде містити табличний віджет з двома колонками і рядками буде виглядати наступним чином:
#include <gtk/gtk.h> /* усе необхідне для GTK*/

/* вказівник на тип GtkWidget, який буде мітити структуру
** нашого вікна */
GtkWidget* window,
         * treeview ;
/* заповнення даними винесено в дану функцію */
void fill_treeview_with_data () ;

/* головна функція програми */
int main (int argc, char** argv) 
{
    /* Дуже важливо! Перед використанням бібліотеки, її необхідно
    ** ініціалізувати, в іншому випадку ваша програма не буде працювати */
    gtk_init (&argc, &argv) ;
    
    /* допоміжні вказівники */
    GtkCellRenderer* renderer ; /* примірник комірки таблиці */
	GtkListStore* liststore ; /* модель представлення даних */
	GtkTreeViewColumn* column ; /* колонка */

    /* init tree views */
	unsigned int iter, lter;
	    
    /* створюємо звичайне вікно */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL) ;
    /* створюємо віджет табличного представлення */
    treeview = gtk_tree_view_new () ;
    
    /* в добавок встановлюємо заголовок вікна */
    gtk_window_set_title (GTK_WINDOW(window), "Вікно табличного віджета") ;
    /* і його розмір за умовчанням */
    gtk_window_resize (GTK_WINDOW(window), 600, 500) ;

    /* створюємо масив, який вказує тип колонок */
    iter = 5 ;
	GType* types_mass = new GType [iter+1] ;

	for (lter=0; lter<iter; lter++)
	{ types_mass[lter]=G_TYPE_STRING; }

    /* створюємо об'єкт представлення даних */
	liststore = gtk_list_store_newv (iter, types_mass) ;
    
    /* вивільняємо пам'ять */
	delete[] types_mass ;
	
	/* створюємо колонки і зв'язуємо їх з віджетом */
	
	/* створюємо примірник комірки таблиці */
	renderer = gtk_cell_renderer_text_new () ;
	/* створюємо першу колонку */
	column = gtk_tree_view_column_new_with_attributes ("Номер", renderer, "text", 0, NULL) ;
	/* дозволяємо зміну розміру */
	g_object_set (G_OBJECT(column), "resizable", true, NULL) ;
	/* упаковуємо в табличний віджет */
	gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), GTK_TREE_VIEW_COLUMN(column)) ;

	column = gtk_tree_view_column_new_with_attributes ("Дані", renderer, "text", 1, NULL) ;
	g_object_set (G_OBJECT(column), "resizable", true, NULL) ;
	gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), GTK_TREE_VIEW_COLUMN(column)) ;
	
	/* зв'язуємо представлення з віджетом */
	gtk_tree_view_set_model (GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(liststore)) ;

    /* упаковуємо табличний віджет у головне вікно */
    gtk_container_add ((GtkContainer*)window, treeview) ;
    
    /* За допомогою даної функції ми прив'язуємо події до 
    ** спеціальних функцій-обробників. */
    g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL) ;
    
    /* показуємо створене вікно */
    gtk_widget_show_all (window) ;
    
    /* викликаємо функцію заповнення даними табличного віджета */
    fill_treeview_with_data () ;
    
    /* Запускаємо головний цикл GTK-програми. Без цього вікно не 
    ** буде реагувати на події*/
    gtk_main () ;
    
    /* знищуємо вікно і його елементи, і вивільняємо пам'ять */
    gtk_widget_destroy (window) ;
    
    /* у разі закриття вікна (спрацювання функції 
    ** gtk_main_quit) - вихід з програми */
    return 0 ;
}

void fill_treeview_with_data ()
{
    /* необхідні вказівники */
    GtkListStore* liststore ;
    GtkTreeIter titer ;

    /* отримуємо вказівник на об'єкт представлення даних з віджета */
    liststore = GTK_LIST_STORE (gtk_tree_view_get_model(GTK_TREE_VIEW(treeview))) ;

    /* створюємо новий рядок в представленні */
    gtk_list_store_append (liststore, &titer) ;
    /* заповнюємо дані */
    gtk_list_store_set (liststore, &titer, 0, "1", 1, "Data1", -1) ;
    
    /* створюємо новий рядок в представленні */
    gtk_list_store_append (liststore, &titer) ;
    /* заповнюємо дані */
    gtk_list_store_set (liststore, &titer, 0, "2", 1, "Data2", -1) ;
}
Компілюється дана програма командою (“treeview.cxx” - вихідний код програми, “file” - ім'я кінцевого виконуваного файлу)
g++ treeview.cxx -o file `pkg-config --cflags --libs gtk+-3.0`
Після запуску файлу “file” на виконання ми отримаємо: gtk_tree_view_with_window_simple
Категорії: