我已创建了一个笔记本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