GtkNoteBook信号处理问题

时间:2009-11-23 06:04:52

标签: c gtk

我创建了一个笔记本GTK +小部件,我试图在一些事件上设置回调,如下所示:

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 个答案:

答案 0 :(得分:4)

你正在连接错误的信号。你正在使用的是键绑定信号。当您按下键盘上的键移动焦点,聚焦标签或更改当前页面时会发出它们,例如Page Up,Page Down等。不幸的是,你真的没办法知道这一点,因为这些信号未记录在GTK文档中。

而不是change-current-page,请使用switch-page。而不是焦点信号,连接到GtkWidget的各种焦点信号。

答案 1 :(得分:2)

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

更新:当你添加新页面时,如果笔记本的当前焦点实际上没有改变以便显示新页面,我不希望它发出你提到的信号。您当然可以通过调用gtk_notebook_set_current_page()强制它显示新添加的页面。页码由gtk_notebook_append_page()和朋友返回。

更新2 :这是次要内容,但是您应该使用G_OBJECT()而不是GTK_OBJECT()投射对象,因为g_signal_connect()函数是一个glib作用于GObjects的函数。