我尝试根据文件中的行数创建按钮, 每个按钮都会打印行内容 这是我的代码:
while (fgets(line, sizeof line, config) != NULL)
{
GtkWidget *button = gtk_button_new_with_label (line+12);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (type),line);
gtk_container_add (GTK_CONTAINER (container), button);
gtk_widget_show_all (container);
}
void type(char *string)
{
printf("the line contents are %s\n",string);
}
我得到的只是
行内容
我怀疑这是因为我将具有不同参数的信号连接到同一个按钮(按钮名称不会改变:()
我需要保持这种动态,文件内容改变很多,我需要根据行数创建按钮,并使用这些按钮在相应的行上执行功能。
感谢。
答案 0 :(得分:1)
您的假设部分正确。信号处理程序的格式是
return-type function-name(Type *sender, extra arguments, gpointer user_data)
其中sender
是g_signal_connect()
的第一个参数,user_data
是g_signal_connect()
的最后一个参数。在GtkButton::clicked
的情况下,没有额外的参数,返回类型为void
,因此您的信号函数应具有以下签名:
void type(GtkButton *b, gpointer data)
您可以将data
投射到char *
进行打印。
话虽这么说,你的程序永远不会像书面那样工作。当您将line
传递给g_signal_connect()
时,您正在为每个连接提供相同的 line
指针,该指针始终指向相同的缓冲。因此,每次fgets()
时,以前在line
中的行都会被替换。假设当信号处理程序运行时line
没有超出范围,您将只获得每个按钮的最后一行。如果line
超出范围,行为未定义。
正确的做法是为信号处理程序提供行的副本。您可以使用g_strdup()
执行此操作。请记住,您有责任释放这些副本。