Как мне подключить сигнал GtkAction? - PullRequest
2 голосов
/ 01 февраля 2012

Я пытаюсь подключить сигнал GtkAction к обратному вызову open_file, но, видимо, я что-то упускаю, так как ничего не происходит, когда я выбираю Открыть в меню файла. Любые подсказки?

test.c

#include <gtk/gtk.h>

void open_file(GtkAction *action, gpointer user_data)
{
   g_print("open_file\n");
}


int main(int argc, char *argv[])
{
   GtkBuilder *builder;
   GObject *window;

   gtk_init(&argc, &argv);

   builder = gtk_builder_new();
   gtk_builder_add_from_file(builder, "test.ui", NULL);

   window = gtk_builder_get_object(builder, "window");
   g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
   gtk_widget_show_all(GTK_WIDGET(window));

   gtk_main();
   return 0;
}

test.ui

<interface>
   <object class="GtkUIManager" id="uiman">
     <child>
        <object class="GtkActionGroup" id="actiongroup">
           <child>
              <object class="GtkAction" id="file">
                 <property name="label">_File</property>
              </object>
           </child>
           <child>
              <object class="GtkAction" id="open">
                 <property name="stock_id">gtk-open</property>
                 <signal name="activate" handler="open_file"/>
              </object>
           </child>
        </object>
     </child>
     <ui>
        <menubar name="menu_bar">
           <menu action="file">
              <menuitem action="open"/>
           </menu>
        </menubar>
     </ui>
   </object>

   <object id="window" class="GtkWindow">
     <property name="title">Test</property>
     <child>
        <object class="GtkVBox" id="vbox">
           <child> 
              <object class="GtkMenuBar" id="menu_bar" constructor="uiman"/>
              <packing>
                 <property name="expand">FALSE</property>
              </packing> 
           </child>
        </object>
     </child>
   </object>
</interface>

Ответы [ 2 ]

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

Сигналы в файле glade останутся отключенными, если вы не наберете gtk_builder_connect_signals().

1 голос
/ 30 мая 2014

Если вы намереваетесь портировать вашу программу на окна, вам также может понадобиться использовать G_MODULE_EXPORT в прототипах / определениях вашей функции:

G_MODULE_EXPORT void my_callback(void); /* For example */
...