2011-04-22 218 views
0

我試圖創建GTK +一個窗口,具有標籤如下所示:錯誤:不被忽略,因爲它應該是空值 - C/GTK +

enter image description here

每當用戶單擊「新建「按鈕,出現一個新選項卡。

然而,當我編譯我的節目,我得到了一個錯誤:空值不被忽略,因爲它應該是

[email protected]:~$ g++ /home/phongcao/C++/GTK+/newtab.cc -o /home/phongcao/C++/GTK+/newtab `pkg-config gtk+-2.0 --cflags --libs` 
/home/phongcao/C++/GTK+/newtab.cc: In function ‘int main(int, char**)’: 
/home/phongcao/C++/GTK+/newtab.cc:51:3: error: void value not ignored as it ought to be 


這裏是代碼:

#include <gtk/gtk.h> 

void destroy(GtkWidget *window, gpointer data) { 
    gtk_main_quit(); 
} 

void new_tab(GtkNotebook *notebook, GtkWidget *content, GtkWidget *hbox) { 
    gtk_notebook_append_page(notebook, content, hbox); 
} 

int main(int argc, char *argv[]) 
{ 
    GtkWidget *window, *label, *content; 
    GtkWidget *button, *hbox, *notebook; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_container_set_border_width(GTK_CONTAINER(window), 10); 
    gtk_window_set_title(GTK_WINDOW(window), "New Tab"); 
    gtk_widget_set_size_request(window, 300, 200); 

    notebook = gtk_notebook_new(); 

    button = gtk_button_new_with_label("New"); 
    label = gtk_label_new("Tab"); 
    hbox = gtk_hbox_new(FALSE, 5); 
    content = gtk_label_new("This is a tab"); 
    gint a = 0; 

    gtk_box_pack_start_defaults(GTK_BOX(hbox), label); 
    gtk_box_pack_start_defaults(GTK_BOX(hbox), button); 

    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), content, hbox); 
    gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP); 

    //This following line is where the error is from: 
    g_signal_connect(G_OBJECT(button), "new_tab", G_CALLBACK(new_tab(GTK_NOTEBOOK(notebook), content, hbox)), NULL); 

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL); 

    gtk_container_add(GTK_CONTAINER(window), notebook); 

    gtk_widget_show_all(hbox); 
    gtk_widget_show_all(window); 

    gtk_main(); 
    return 0; 
} 


感謝您的幫助!對此,我真的非常感激!!

+0

看起來好像你嘗試使用void函數的返回值。我不能算到53,所以不能說在什麼路線上。 – 2011-04-22 06:30:21

+0

你可以在編譯器抱怨的行上添加註釋嗎?你的例子只有48行:) – hammar 2011-04-22 06:31:32

+0

我已經添加了對錯誤發生的行的評論...對不起,傢伙! – phongvcao 2011-04-22 06:40:35

回答

4

行號並沒有多大意義,我,但我覺得你的問題就在這裏(格式化用於說明目的):

g_signal_connect(G_OBJECT(button), "new_tab", 
    G_CALLBACK(new_tab(GTK_NOTEBOOK(notebook), content, hbox)), /* <== Badness */ 
    NULL 
); 

你調用內部的G_CALLBACKnew_tab功能。 new_tab函數返回void(即沒有返回值),但是它在需要一個值的上下文中被調用,因此「void value not ignored」錯誤被調用。我想你的意思是說更像這樣的東西:

g_signal_connect(G_OBJECT(button), "new_tab", G_CALLBACK(new_tab), NULL); 
+0

嗯,但我怎麼能讓「新建」按鈕打開一個新的選項卡,如果我沒有傳遞任何參數到new_tab函數...你知道任何用其他方式解決這個問題?謝謝你的回答非常好! – phongvcao 2011-04-22 06:36:21

+1

您正在給'g_signal_connect'函數指針,它會在需要時調用該函數。這個'GTK_NOTEBOOK(notebook)'強制轉換將放在你的'new_tab()'函數中,你可以使用'g_signal_connect()'的第四個參數將額外的數據傳遞給你的函數。第四個參數是AFAIK,作爲第二個參數傳遞給你的函數,請參閱你的'destroy()'函數來獲取如何調用回調的例子。當你需要它們時,你應該能夠查找你的兩個'GtkWidget *'而不是傳遞它們。 – 2011-04-22 07:07:18

+0

你可以寫出代碼...我試過了,但它仍然沒有工作... – phongvcao 2011-04-22 07:23:33

2
g_signal_connect(G_OBJECT(button), "new_tab", G_CALLBACK(new_tab(GTK_NOTEBOOK(notebook), content, hbox)), NULL); 

你確定你想傳遞參數給new_tab()?簡單地說就是G_CALLBACK(new_tab)。這將解決錯誤。

如果你想調用「new_tab」,那麼你必須在適當的地方明確地調用該函數(比如在傳遞給G_CALLBACK之前)。

爲了您的查詢,您可以參考這個small tutorial

+0

如果我不將參數傳遞到新選項卡,然後單擊「新建」按鈕將不會打開新選項卡。 順便說一下,你知道任何其他方式來解決這個問題嗎? (用新的按鈕創建一個窗口,可以打開新標籤)我不知道我的礦井是否已經是最優的一個了...... – phongvcao 2011-04-22 06:32:57

+0

當您將該函數名稱作爲參數傳遞時,無法將參數傳遞給函數名稱。另外,你可以看到你對'Destroy'沒有做同樣的事情。你可以嘗試從'new_tab'中移除參數並查看嗎? – iammilind 2011-04-22 06:37:03

+0

哦,我確實刪除了new_tab中的參數,但是當我點擊「新建」按鈕時,沒有新的選項卡出現......您是否有另一種解決方案來解決這個新選項卡問題? – phongvcao 2011-04-22 06:41:52

相關問題