среда, 30 сентября 2009 г.

Виджет GtkComboBox, часть 1-я.

Наконец-то; первый осмысленный пост. Сегодня мы будем рассматривать виджет GtkComboBox. Почему? Потому что официальное учебное руководство Gtk+ освящает работу только с устаревшим GtkCombo. GtkComboBox - это виджет, который позволяет пользователям выбрать из списка или дерева нужный им вариант. Это достаточно богатый на возможности виджет. С его помощью можно отобразить от простых текстовых строк, до совокупности данных из изображений, индикаторов срока выполнения тех или иных операций и т.д. Все это отражено в его API(прикладной программный интерфейс), который можно разделить на "простой" и "сложный", который тесно соотносится с интерфейсом GtkCellLayout. Сегодня мы будем рассматривать "простые" функции API.
Содержание этого учебного материала:
  1. Виджет GtkComboBox, часть 1-я ("простой" API)
  2. Виджет GtkComboBox, часть 2-я("сложный" API)
  3. Виджет GtkComboBox, часть 3-я(проверка полученных знаний)


"Простое" API
Состоит из 7 функций:

  • gtk_combo_box_new_text - создает выпадающий список(combo box)
  • gtk_combo_box_append_text, gtk_combo_box_prepend_text и gtk_combo_box_insert_text - добавляют элементы на выпадающий список
  •  gtk_combo_box_get_active_text - для получения текущего выделенного элемента
  • gtk_combo_box_get_active - для получения значения индекса активного элемента (эта функция - часть как "простого", так и "сложного" API)
  • gtk_combo_box_remove_text - удаляет элемент из выпадающего списка.


Но хватит разглагольствовать, пора и написать что-нибудь, чтобы лучше понять, как все это использовать на практике 8-)

Этот пример покажет, как создать простой, содержащий только текст, выпадающий список, используя API-функции, которые мы рассмотрели выше.

/* Test me with:
*   gcc -o combo combo.c $(pkg-config --cflags --libs gtk+-2.0) && ./combo
*/

#include 

/* This function gets called when currently selected item changes */
static void
cb_changed( GtkComboBox *combo,
gpointer     data )
{
/* Obtain currently selected string from combo box */
gchar *string = gtk_combo_box_get_active_text( combo );

/* Print it to the console - if nothing is selected, print NULL */
g_print( "Selected (simple): >> %s <<\n", ( string ? string : "NULL" ) );

/* Free string */
g_free( string );
}

/* This function deletes currently selected item from combo box */
static void
cb_delete( GtkButton   *button,
GtkComboBox *combo )
{
gint index;

/* Get currently selected item's index */
index = gtk_combo_box_get_active( combo );

/* Remove this item from combo */
gtk_combo_box_remove_text( combo, index );
}

int
main( int    argc,
char **argv )
{
/*Common variables */
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *frame;
GtkWidget *combo;
GtkWidget *button;

/* Initialization */
gtk_init( &argc, &argv );

/* Create main window */
window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
g_signal_connect( G_OBJECT( window ), "destroy",
G_CALLBACK( gtk_main_quit ), NULL );
gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );

/* Create vbox */
vbox = gtk_vbox_new( FALSE, 6 );
gtk_container_add( GTK_CONTAINER( window ), vbox );

/* Create frame */
frame = gtk_frame_new( "Text API" );
gtk_box_pack_start( GTK_BOX( vbox ), frame, FALSE, FALSE, 0 );

/* Create combo box using text API and add some data to it */
combo = gtk_combo_box_new_text();
gtk_container_add( GTK_CONTAINER( frame ), combo );
gtk_combo_box_append_text( GTK_COMBO_BOX( combo ), "Hello World once" );
gtk_combo_box_prepend_text( GTK_COMBO_BOX( combo ), "Hello World twice" );
gtk_combo_box_insert_text( GTK_COMBO_BOX( combo ), 1, "Hello World last time" );

/* Connect signal to tour handler function */
g_signal_connect( G_OBJECT( combo ), "changed",
G_CALLBACK( cb_changed ), NULL );


/* Add button that, when clicked, deletes currently selected entry */
button = gtk_button_new_with_mnemonic( "_Delete selected item" );
gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, FALSE, 0 );
g_signal_connect( G_OBJECT( button ), "clicked",
G_CALLBACK( cb_delete ), GTK_COMBO_BOX( combo ) );

/* Show our application and start main loop */
gtk_widget_show_all( window );
gtk_main();

return( 0 );
}
Оригинал статьи находится здесь

1 коммент.:

Анонимный комментирует...

огромное спасибо

Отправить комментарий