Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误:无效值未被忽略,因为它应该是-C/GTK+;_C++_C_Gtk_Gtkmm - Fatal编程技术网

C++ 错误:无效值未被忽略,因为它应该是-C/GTK+;

C++ 错误:无效值未被忽略,因为它应该是-C/GTK+;,c++,c,gtk,gtkmm,C++,C,Gtk,Gtkmm,我正在尝试在GTK+中创建一个具有如下选项卡的窗口: g_signal_connect(G_OBJECT(button), "new_tab", G_CALLBACK(new_tab), NULL); 每当用户单击“新建”按钮时,就会出现一个新选项卡 然而,当我编译我的程序时,我得到了一个错误:void值并没有像应该的那样被忽略 下面是代码: #include <gtk/gtk.h> void destroy(GtkWidget *window, gpointer data)

我正在尝试在GTK+中创建一个具有如下选项卡的窗口:

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

每当用户单击“新建”按钮时,就会出现一个新选项卡

然而,当我编译我的程序时,我得到了一个错误:void值并没有像应该的那样被忽略


下面是代码:

#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;
}
#包括
无效销毁(GtkWidget*窗口,gpointer数据){
gtk_main_quit();
}
作废新选项卡(GtkNotebook*笔记本、GtkWidget*内容、GtkWidget*hbox){
gtk_笔记本_附加_页面(笔记本、内容、hbox);
}
int main(int argc,char*argv[])
{
GtkWidget*窗口、*标签、*内容;
GtkWidget*按钮、*hbox、*笔记本;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_容器_设置_边框_宽度(gtk_容器(窗口),10);
gtk_窗口设置标题(gtk_窗口(窗口),“新选项卡”);
gtk_小部件_设置_大小_请求(窗口,300200);
notebook=gtk_notebook_new();
按钮=gtk_按钮_新按钮_标签(“新”);
标签=gtk_标签_新(“标签”);
hbox=gtk_hbox_新(假,5);
内容=gtk_标签_新(“这是一个标签”);
gint a=0;
gtk_-box_-pack_-start_默认值(gtk_-box(hbox),标签);
gtk_盒\包装\启动\默认值(gtk_盒(hbox),按钮);
gtk_笔记本_附加_页面(gtk_笔记本(笔记本),内容,hbox);
gtk_笔记本_套装_标签_位置(gtk_笔记本(笔记本),gtk_位置_顶部);
//以下行是错误的来源:
g_信号_连接(g_对象(按钮),“新建_选项卡”,g_回调(新建_选项卡(GTK_笔记本(笔记本),内容,hbox)),空);
g_信号连接(g_对象(窗口),“销毁”,g_回调(销毁),空);
gtk_容器添加(gtk_容器(窗口)、笔记本);
gtk_widget_show_all(hbox);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}

谢谢你的帮助!!我真的很感激

g_signal_connect(G_OBJECT(button), "new_tab", G_CALLBACK(new_tab(GTK_NOTEBOOK(notebook), content, hbox)), NULL);
是否确实要将参数传递到
新选项卡()
?简单地说
G\u回调(新建选项卡)
。这将解决错误

如果要调用“new_tab”,则必须在适当的位置显式调用该函数(比如在传递到
G_CALLBACK
之前)

对于您的查询,您可以参考此

是否确实要将参数传递到
新选项卡()
?简单地说
G\u回调(新建选项卡)
。这将解决错误

如果要调用“new_tab”,则必须在适当的位置显式调用该函数(比如在传递到
G_CALLBACK
之前)


对于您的查询,您可以参考这一点。

行号对我来说没有多大意义,但我认为您的问题就在这里(为了说明目的重新格式化):


行号对我来说没有多大意义,但我认为您的问题就在这里(为了说明目的重新格式化):



您似乎试图使用void函数的返回值。我不能数到53,所以不能说在哪一行。你能给编译器抱怨的那一行添加注释吗?您的示例只有48行:)我已经在发生错误的行上添加了注释。。。对不起,伙计们!!您似乎试图使用void函数的返回值。我不能数到53,所以不能说在哪一行。你能给编译器抱怨的那一行添加注释吗?您的示例只有48行:)我已经在发生错误的行上添加了注释。。。对不起,伙计们!!嗯,如果我没有将参数传递给新选项卡,那么单击“新建”按钮将不会打开新选项卡。顺便问一下,你知道解决这个问题的其他方法吗?(用新按钮创建一个可以打开新选项卡的窗口)我不知道我的是否已经是最佳的……当你将函数名作为参数传递时,你不能将参数传递给函数名。此外,您还可以看到,您对
销毁
没有执行相同的操作。你能试着从
new\u tab
中删除参数吗?哦,我确实从new\u tab中删除了参数,但是当我单击“new”按钮时,没有出现新选项卡。。。对于这个新的制表符问题,您有其他解决方案吗?顺便问一下,您知道如何将多个参数传递给g_signal_connect g_回调函数吗?我可以在最后一个参数中添加其他数据而不是NULL吗?我在答案中添加了一个教程链接。请参考,如果它可以帮助你。嗯,如果我没有把参数传递给新标签,那么点击“新建”按钮将不会打开新标签。顺便问一下,你知道解决这个问题的其他方法吗?(用新按钮创建一个可以打开新选项卡的窗口)我不知道我的是否已经是最佳的……当你将函数名作为参数传递时,你不能将参数传递给函数名。此外,您还可以看到,您对
销毁
没有执行相同的操作。你能试着从
new\u tab
中删除参数吗?哦,我确实从new\u tab中删除了参数,但是当我单击“new”按钮时,没有出现新选项卡。。。对于这个新的制表符问题,您有其他解决方案吗?顺便问一下,您知道如何将多个参数传递给g_signal_connect g_回调函数吗?我可以在最后一个参数中添加其他数据而不是NULL吗?我在答案中添加了一个教程链接。请参考,如果它可以帮助你。嗯,但是如果我没有向New_tab函数传递任何参数,我如何使“New”按钮打开一个新选项卡。。。你知道解决这个问题的其他方法吗?谢谢你,你的回答很好!您给
g\u signal\u connect
一个指向函数的指针,它会在需要时调用该函数。这个
GTK_笔记本(NOTEBOOK)
cast将放入
new_tab()
函数中,您可以使用
g_signal_connect()的第四个参数将额外数据传递给函数。第四个参数是AFAIK,作为第二个参数传递给函数,有关如何调用回调的示例,请参见
destroy()
函数。您应该能够在需要时查找两个
GtkWidget*
g_signal_connect(G_OBJECT(button), "new_tab",
    G_CALLBACK(new_tab(GTK_NOTEBOOK(notebook), content, hbox)), /* <== Badness */
    NULL
);
g_signal_connect(G_OBJECT(button), "new_tab", G_CALLBACK(new_tab), NULL);