2012-02-17 48 views
0

我正在用C編寫一個圖形程序,其中我有一個從XML文件構建的GTK窗口。這個窗口有幾個按鈕和處理程序對應於每個按鈕(例如,如果按鈕顯示「circle」,則會有一個名爲「on_circle_clicked()」的處理程序)。我想要點擊這些按鈕時處理事件。我該怎麼做呢?處理從一個XML文件構建的gtkwidget的事件

+0

您使用的是GTK(C API)還是GTKmm(C++綁定)? – liberforce 2012-02-17 17:10:57

+0

我正在使用GTK。這是代碼: – 2012-02-17 17:13:29

+0

void initGuiWindow() { builder = gtk_builder_new(); gtk_builder_add_from_file(builder,「assignment1gui.xml」,(GError **)NULL); window = GTK_WIDGET(gtk_builder_get_object(builder,「window」)); gtk_builder_connect_signals(builder,NULL); } – 2012-02-17 17:13:46

回答

2

信號處理代碼進入您的信號處理程序。按照你的例子,如果你點擊「圈子」,其中有一個「點擊」信號處理程序爲「on_circle_clicked」,那麼當按鈕被點擊on_circle_clicked將被稱爲&這將有邏輯來處理點擊該按鈕。要使用glade(它生成您正在使用的xml文件)來執行此操作,請在創建xml文件時爲該小部件添加信號處理程序的名稱。這些信號處理程序將不得不在你的源代碼中實現。您可能會發現theselinks有用。請看以下樣本,供您參考:
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 ,您應該在Linux/Unix上用-Wl,--export-dynamic C標誌編譯您的程序&針對的鏈接10。在Windows上,您需要在信號處理程序之前添加G_MODULE_EXPORT
  2. 由於信號處理器符號擡頭,讓它作爲一個static功能或隱藏功能(例如設置visibility屬性的功能爲「隱藏」與海灣合作委員會)

希望這可以幫助!