Здесь продемонстрируется минимальный код приложения, которое показывает в главном окне всего два виджета: GtkEntry и GtkLabel. При вводе некоего текста в GtkEntry этот текст будет отображаться в GtkLabel.
Создание соответствующего интерфейса в Glade тривиально и больших комментариев не требует. Запускаем Glade.
Оставляем как есть. Жмем Close.
Далее создаем окно приложения:
Добавляем в него вертикальный ящик с тремя ячейками:
Далее вставляем в эти ячейки наши GtkEntry и GtkLabel, а также кнопку выхода из приложения:
Для обработки сигнала clicked кнопки выхода выбираем стандартный gtk_main_quit. А для обработки сигнала changed (находим его в GtkEditable) выбираем любой предлагаемый вариант (не возбраняется и свой вариант набрать). Выберем on_entry1_changed. Не забываем потом написать код для этой функции.
А вот собственно код нашего приложения:
/*labelAndEntry.c*/
#include <gtk/gtk.h>
typedef struct _ddata ddata;
struct _ddata{
GtkWidget* window1;
GtkWidget* entry1;
GtkWidget* label1;
GtkWidget* button1;
} ;
ddata* myData;
int
main( int argc, char **argv )
{
GtkBuilder *builder;
GtkWidget *window;
GError *error = NULL;
/* инициализируем GTK+ */
gtk_init( &argc, &argv );
/* создаем новый объект типа GtkBuilder */
builder = gtk_builder_new();
/* загружаем пользовательский интерфес из файла, который мы создали в Glade */
if( ! gtk_builder_add_from_file( builder, "entryAndLabel.xml", &error ) )
{
g_warning( "%s", error->message );
g_free( error );
return( 1 );
}
myData = g_slice_new(ddata);
myData->window1 = GTK_WIDGET( gtk_builder_get_object( builder, "window1" ) );
myData->entry1 = GTK_WIDGET( gtk_builder_get_object( builder, "entry1" ) );
myData->label1 = GTK_WIDGET( gtk_builder_get_object( builder, "label1" ) );
myData->button1 = GTK_WIDGET( gtk_builder_get_object( builder, "button1" ) );
/*
заметим, что имена полей структуры myData не обязаны совпадать со вторым аргументом функции gtk_builder_get object, они произвольны. Но этот второй аргумент должен совпадать с именем виджета, которое мы задали ему в окне "Doc Properties" Glade во вкладке General
*/
/* Get main window pointer from UI */
// window = GTK_WIDGET( gtk_builder_get_object( builder, "window1" ) );
/* "связываем" сигналы с объектами графического интерфейса */
// gtk_builder_connect_signals( builder, NULL );
gtk_builder_connect_signals( builder, myData );
/* разрушаем объект builder, так как он нам больше не нужен */
g_object_unref( G_OBJECT( builder ) );
/* даем команду показать главное окно приложения, а остальные виджеты отображаются объектом GtkBuilder */
gtk_widget_show( myData -> window1 );
/* стартуем */
gtk_main();
g_slice_free(ddata, myData);
return( 0 );
}
void
on_entry1_changed (GtkEditable *editable,
gpointer user_data) {
puts("changed!");
gtk_label_set_text(GTK_LABEL(myData->label1), gtk_entry_get_text(GTK_ENTRY(editable) ));
}
/*
имя этой функции должно совпадать с именем, которое мы дали обработчику соответствующего события (у нас - changed) в окне "Doc Properties" и вкладке Signals.
*/
Компилируем:
$ gcc -o labelAndEntry labelAndEntry.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0)
Запускаем на выполнение. Должно получиться следующее:
Если запустить наше прилодение из командной строки, то также при вводе какого-либо символа в GtkEntry, в консоли будет выводиться сообщение "changed!". При нажатии на кнопку будет осуществлен выход.
Все вышеописанное выполнялось в Debian squeeze.
1 комментарий:
я запустил Ваш код через MSYS2 на Windows, всё компилится, но при запуске программы выдаёт пресловутое "Could not find signal handler 'on_entry1_changed'. Did you compile with -rdynamic?" Что посоветуете?
Отправить комментарий