Обработка событий из gtkwidget, созданного из файла XML - PullRequest
0 голосов
/ 17 февраля 2012

Я пишу графическую программу на C, где у меня есть окно GTK, построенное из файла XML.В этом окне есть несколько кнопок и обработчиков, соответствующих каждому (например, если кнопка говорит «круг», то есть обработчик с именем «on_circle_clicked ()»).Я хочу обрабатывать события при нажатии этих кнопок.Как мне это сделать?

1 Ответ

2 голосов
/ 18 февраля 2012

Код обработки сигнала входит в ваш обработчик сигнала.Согласно вашему примеру, если вы нажмете кнопку «круг», в которой есть обработчик сигнала для «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>

Вещи, с которыми вам следует быть осторожным:

  1. Как упомянуто в документации для gtk_builder_connect_signals, вы должны скомпилировать вашу программу с флагами -Wl,--export-dynamic C в Linux / Unix и ссылками на gmodule-export-2.0.В Windows вам нужно добавить G_MODULE_EXPORT перед обработчиком сигнала.
  2. Когда ищется символ обработчика сигнала, не делает его функцией static или скрыть функцию (например, установить атрибут видимости для функции как «скрытый» с помощью gcc)

Надеюсь, это поможет!

...