我已創建了一個筆記本GTK +窗口小部件,我試圖如下設置上的一些事件回調:GtkNoteBook信號處理問題
m_notebook = gtk_notebook_new();
g_signal_connect(GTK_OBJECT(m_notebook), "move-focus-out", G_CALLBACK(on_notebook_move_focus_out), NULL);
g_signal_connect(GTK_OBJECT(m_notebook), "focus-tab", G_CALLBACK(on_notebook_focus_tab), NULL);
g_signal_connect(GTK_OBJECT(m_notebook), "change-current-page", G_CALLBACK(on_notebook_change_current_page), NULL);
gtk_container_add(GTK_CONTAINER (m_window), m_notebook);
而這些都是回調函數原型:
G_MODULE_EXPORT gboolean on_notebook_move_focus_out(GtkNotebook *notebook, GtkNotebookTab arg1, gpointer user_data);
G_MODULE_EXPORT gboolean on_notebook_focus_tab(GtkNotebook *notebook, GtkNotebookTab arg1, gpointer user_data);
G_MODULE_EXPORT gboolean on_notebook_change_current_page(GtkNotebook *notebook, gint arg1, gpointer user_data);
我在運行時使用這個函數調用附加頁面到筆記本:
gtk_notebook_append_page(GTK_NOTEBOOK(m_notebook),msg_vbox,label);
但我沒有收到上述任何事件。我究竟做錯了什麼?
相關代碼如下:
/*
* Compile me with:
gcc -o notebook notebook.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0)
*/
#include <gtk/gtk.h>
static gboolean on_m_notebook_move_focus_out(GtkNotebook *notebook, GtkDirectionType arg1, gpointer user_data);
static gboolean on_m_notebook_focus_tab(GtkNotebook *notebook, GtkNotebookTab arg1, gpointer user_data);
static gboolean on_m_notebook_change_current_page(GtkNotebook *notebook, gint arg1, gpointer user_data);
int main (int argc, char *argv[])
{
GtkWidget *m_window;
GtkWidget *m_notebook;
gtk_init (&argc, &argv);
m_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(m_window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(m_window), 350, 500);
m_notebook = gtk_notebook_new();
g_signal_connect(GTK_OBJECT(m_notebook), "move-focus-out", G_CALLBACK(on_m_notebook_move_focus_out), NULL);
g_signal_connect(GTK_OBJECT(m_notebook), "focus-tab", G_CALLBACK(on_m_notebook_focus_tab), NULL);
g_signal_connect(GTK_OBJECT(m_notebook), "change-current-page", G_CALLBACK(on_m_notebook_change_current_page), NULL);
gtk_container_add(GTK_CONTAINER (m_window), m_notebook);
GtkWidget *button;
button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
gtk_notebook_append_page(GTK_NOTEBOOK(m_notebook), button, NULL);
button = gtk_button_new_from_stock (GTK_STOCK_ADD);
gtk_notebook_append_page(GTK_NOTEBOOK(m_notebook), button, NULL);
button = gtk_button_new_from_stock (GTK_STOCK_DELETE);
gtk_notebook_append_page(GTK_NOTEBOOK(m_notebook), button, NULL);
button = gtk_button_new_from_stock (GTK_STOCK_DIALOG_INFO);
gtk_notebook_append_page(GTK_NOTEBOOK(m_notebook), button, NULL);
gtk_widget_show_all(m_window);
gtk_main();
return 0;
}
gboolean on_m_notebook_move_focus_out(GtkNotebook *notebook, GtkDirectionType arg1, gpointer user_data)
{
printf("on_m_notebook_move_focus_out\n");
return FALSE;
}
gboolean on_m_notebook_focus_tab(GtkNotebook *notebook, GtkNotebookTab arg1, gpointer user_data)
{
printf("on_m_notebook_focus_tab []\n");
return FALSE;
}
gboolean on_m_notebook_change_current_page(GtkNotebook *notebook, gint arg1, gpointer user_data)
{
printf("on_m_notebook_change_current_page\n");
return FALSE;
}
這裏的頁面在追加後可見。 增加了gtk_widget_show_all(GTK_WIDGET(msg_vbox))函數調用,它無助於觸發事件。 – kbalar 2009-11-23 11:33:25
我沒有通過更改信號名稱獲得任何警告。直到我無法觸發事件。 – kbalar 2009-11-23 13:39:41
破折號和下劃線無關緊要,只要您不要在一個信號名稱中混合它們即可。 – ptomato 2009-11-24 11:12:07