2009-11-23 68 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