C++ 错误:无效值未被忽略,因为它应该是-C/GTK+;
我正在尝试在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)
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);