2009-11-23 67 views
0

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

回答

2

通常网页加入后看不见的,这可能是为什么笔记本电脑没有反应。尝试调用gtk_widget_show_all(GTK_WIDGET(msg_vbox))使其可见,并查看是否触发任何事件。

UPDATE:当你添加新的页面,如果笔记本目前的重点实际上并不改变,使新页面显示,我不希望它发出你所提到的信号。您当然可以通过致电gtk_notebook_set_current_page()强制显示新添加的页面。页码由gtk_notebook_append_page()和朋友返回。

更新2:这是一个小的,但你应该使用G_OBJECT(),不GTK_OBJECT(),因为g_signal_connect()功能是能说会道的功能作用在GObjects投你的对象。

+0

这里的页面在追加后可见。 增加了gtk_widget_show_all(GTK_WIDGET(msg_vbox))函数调用,它无助于触发事件。 – kbalar 2009-11-23 11:33:25

+0

我没有通过更改信号名称获得任何警告。直到我无法触发事件。 – kbalar 2009-11-23 13:39:41

+0

破折号和下划线无关紧要,只要您不要在一个信号名称中混合它们即可。 – ptomato 2009-11-24 11:12:07

2

您正在连接到错误的信号。你正在使用的是键绑定信号。当您按键盘上的按键移动焦点,聚焦选项卡或更改当前页面时(例如上一页,下一页等),它们就会发出。不幸的是,您确实无法知道这一点,因为这些信号未记录在GTK文档中。使用switch-page代替change-current-page。而不是聚焦信号,连接到GtkWidget的各种聚焦信号。

+0

是的,我可以触发“切换页面”信号。 – kbalar 2009-11-25 05:08:15