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

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

  Все выпуски  

Практические советы по GTK+ (виджет ввода IP адреса)


Представляю виджет GtkIPAddrPicker который служит для ввода IP адреса, он содержит 4 поля ввода по 3 цифровых символа от 0 до 255 включительно, разделители между полями - точки.

Внешний вид: 

Применение готового виджета:

// создать новый виджет

GtkWidget* gtk_ipaddr_picker_new (void);

 

Для ввода нового IP адреса  и получения текущего служат следующие функции:

// ввести новый IP адрес в виде массива чисел

void gtk_ipaddr_picker_set_address(GtkIPAddrPicker *picker,gint ip_address[4]);

// узнать текущий IP адрес в виде строки (память требует удаления через g_free)

gchar* gtk_ipaddr_picker_get_address_str(GtkIPAddrPicker *picker);

// узнать текущий IP адрес в виде массива чисел

void gtk_ipaddr_picker_get_address(GtkIPAddrPicker *picker,gint ip_address[4]);

 

При изменении IP адреса генерируется сигнал "select_picker_value". Прототип обработчика сигнала:

static void picker_changed(GtkBasePicker *picker, gpointer user_data);

 

 

Пример использования: (при сборке потребуются файлы gtkipaddrpicker.h, gtkipaddrpicker.c, gtkbasepicker.h и gtkbasepicker.c )

#include <gtk/gtk.h>

#include "gtkipaddrpicker.h"

 

// обработчик сигнала изменения ip адреса

static gint selected_picker_value(GtkWidget *widget,gpointer data)

{

 printf("IP address changed\n");

}

 

// основная функция

int main (int argc, char *argv[])

{

 GtkWidget *window = NULL;

 GtkWidget *ipaddr_picker;

int addr[4];

 gtk_init (&argc, &argv);

// Главное окно создаем;

 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

// обработчики сигналов завершения

 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);

// виджет ip адреса

 ipaddr_picker = gtk_ipaddr_picker_new(123);

// установить новый ip адрес

 addr[0] = 169;

 addr[1] = 254;

 addr[2] = 0;

 addr[3] = 1;

 gtk_ipaddr_picker_set_address(ipaddr_picker,&addr);

// подключаем обработчик сигнала изменения ip адреса

 g_signal_connect (ipaddr_picker, "select_picker_value",G_CALLBACK (selected_picker_value),NULL);

// упаковка виджета в окно

 gtk_container_add (GTK_CONTAINER (window), vbox);

 gtk_widget_show_all(window);

 gtk_main();

return 0;

}

 

 

 

Если интересно, то можно посмотреть устройство виджета.

GtkIPAddrPicker сделан на основе GtkBasePicker. В базовом классе переопределяем две функции, для инициализации параметров и печати на экране:

picker_class->init_values = ipaddr_init_values;

picker_class->get_val_to_screen = ipaddr_get_val_to_screen;

 

 

В первой функции static void ipaddr_init_values(GtkBasePicker *picker) определяем параметры виджета:

// иннициализация параметров виджета

picker->field_count = 4;// число раздельных полей вода

// следующих параметров должно быть по 4

picker->separator = (gchar**)g_malloc(picker->field_count*sizeof(gchar*));// значения разделителей

picker->field_len = (short*)g_malloc(picker->field_count*sizeof(short));// длины полей

picker->separator_len = (short*)g_malloc(picker->field_count*sizeof(short));// длины разделителей полей

picker->field_val = (int*)g_malloc(picker->field_count*sizeof(int));// значения полей

picker->field_val_min = (int*)g_malloc(picker->field_count*sizeof(int));// минимальные значения полей

picker->field_val_max = (int*)g_malloc(picker->field_count*sizeof(int));// максимальные значения полей

// разделители полей ввода, первый разделитель после первого поля ввода, последний - в конце всего текста

picker->separator[0] = g_strdup(".");

picker->separator[1] = g_strdup(".");

picker->separator[2] = g_strdup(".");

picker->separator[3] = g_strdup("");

// длины полей ввода - 3 символа

picker->field_len[0]=3;

picker->field_len[1]=3;

picker->field_len[2]=3;

picker->field_len[3]=3;

// диапазон вводимых значений для полей 0-255, последнее максимальное значение не учитывается

picker->field_val_min[0] = 0;

picker->field_val_min[1] = 0;

picker->field_val_min[2] = 0;

picker->field_val_min[3] = 0;

picker->field_val_max[0] = 256;

picker->field_val_max[1] = 256;

picker->field_val_max[2] = 256;

picker->field_val_max[3] = 256;

// переносить изменение в следующее по старшинству поле или циклично менять только текущее

picker->carry = FALSE;// при при достижении максимума в одном поле, следующее поле не менять

 

 

 

Во второй функции определяем что будет отображаться на экране:

// что печатать на экране

static gchar* ipaddr_get_val_to_screen(GtkBasePicker *picker_base)

{

       GtkIPAddrPicker *picker = GTK_IPADDR_PICKER(picker_base);

       gchar *str_utf8;

       // новый текст для отображения в поле ввода

       str_utf8 = g_strdup_printf("%3.1d%s%3.1d%s%3.1d%s%3.1d%s",// %3.1d - выравнивание по трём числам, минимум одно печатать

               picker_base->field_val[0],picker_base->separator[0],

               picker_base->field_val[1],picker_base->separator[1],

               picker_base->field_val[2],picker_base->separator[2],

               picker_base->field_val[3],picker_base->separator[3]);

       return str_utf8;

}

 

Полностью исходные исходные коды виджета с комментариями можно посмотреть здесь: gtkipaddrpicker.h   gtkipaddrpicker.c

Исходные коды базового виджета здесь: gtkbasepicker.h   gtkbasepicker.c

В следующих выпусках планируется добавить новые виджеты на основе GtkBasePicker для ввода даты, времени (с учётом текущией локализации) и ввода географических координат (широты и долготы).

P.S. (Все выпуски, включая этот, можно найти в одном файле gtk_book.zip в формате CHM)

 


В избранное