Код обработки сигнала входит в ваш обработчик сигнала.Согласно вашему примеру, если вы нажмете кнопку «круг», в которой есть обработчик сигнала для «clicked» как «on_circle_clicked», то при нажатии кнопки будет вызван on_circle_clicked, и это будет иметь логику для обработки нажатия на эту кнопку.Чтобы сделать это, используя glade (который генерирует тип используемого вами XML-файла), добавьте имена обработчиков сигналов для виджета при создании XML-файла.Эти обработчики сигналов затем должны быть реализованы в вашем исходном коде. эти ссылки могут оказаться полезными.Ниже приведен пример для справки:
sample.c
/* Compile as :gcc sample.c -Wall -Wextra -Wl,--export-dynamic `pkg-config --cflags --libs gtk+-3.0 gmodule-export-2.0` -o sample */
#include <gtk/gtk.h>
void on_circle_clicked(GtkButton * b, gpointer data)
{
(void)b;
(void)data;
printf(" Circle clicked\n");
}
int main(int argc, char **argv)
{
GtkBuilder *builder;
GtkWidget *window;
GError *err = NULL;
const char *builder_file = "sample.glade";
gtk_init(&argc, &argv);
builder = gtk_builder_new();
if (gtk_builder_add_from_file(builder, builder_file, &err) == 0) {
fprintf(stderr, "Error adding builder from file %s\n%s\n",
builder_file, err->message);
return -1;
}
gtk_builder_connect_signals(builder, NULL);
window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
if (window == NULL) {
fprintf(stderr, " Object window not found\n");
return -2;
}
gtk_widget_show_all(window);
gtk_main();
return 0;
}
sample.glade
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkWindow" id="window">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Glade sample</property>
<property name="has_resize_grip">False</property>
<signal name="destroy" handler="gtk_main_quit" swapped="no"/>
<child>
<object class="GtkButton" id="circle">
<property name="label" translatable="yes">circle</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="on_circle_clicked" swapped="no"/>
</object>
</child>
</object>
</interface>
Вещи, с которыми вам следует быть осторожным:
- Как упомянуто в документации для
gtk_builder_connect_signals
, вы должны скомпилировать вашу программу с флагами -Wl,--export-dynamic
C в Linux / Unix и ссылками на gmodule-export-2.0
.В Windows вам нужно добавить G_MODULE_EXPORT
перед обработчиком сигнала. - Когда ищется символ обработчика сигнала, не делает его функцией
static
или скрыть функцию (например, установить атрибут видимости для функции как «скрытый» с помощью gcc)
Надеюсь, это поможет!