2011-04-22 217 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

相关问题