0
我正在用C編寫一個圖形程序,其中我有一個從XML文件構建的GTK窗口。這個窗口有幾個按鈕和處理程序對應於每個按鈕(例如,如果按鈕顯示「circle」,則會有一個名爲「on_circle_clicked()」的處理程序)。我想要點擊這些按鈕時處理事件。我該怎麼做呢?處理從一個XML文件構建的gtkwidget的事件
我正在用C編寫一個圖形程序,其中我有一個從XML文件構建的GTK窗口。這個窗口有幾個按鈕和處理程序對應於每個按鈕(例如,如果按鈕顯示「circle」,則會有一個名爲「on_circle_clicked()」的處理程序)。我想要點擊這些按鈕時處理事件。我該怎麼做呢?處理從一個XML文件構建的gtkwidget的事件
信號處理代碼進入您的信號處理程序。按照你的例子,如果你點擊「圈子」,其中有一個「點擊」信號處理程序爲「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>
事情你應該小心:
gtk_builder_connect_signals
,您應該在Linux/Unix上用-Wl,--export-dynamic
C標誌編譯您的程序&針對的鏈接10。在Windows上,您需要在信號處理程序之前添加G_MODULE_EXPORT
。static
功能或隱藏功能(例如設置visibility屬性的功能爲「隱藏」與海灣合作委員會)希望這可以幫助!
您使用的是GTK(C API)還是GTKmm(C++綁定)? – liberforce 2012-02-17 17:10:57
我正在使用GTK。這是代碼: – 2012-02-17 17:13:29
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