Привіт усім.
Сьогодні я покажу як використовувати табличний віджет у GTK. По плану опис функцій і приклад простої програми.
Функції
Ієрархія конфігурації об'єктів віджета виглядає наступним чином:
Хоча на рисунку зображені групи примірників об'єкта 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” на виконання ми отримаємо: