创建,将信号连接到循环中的按钮

时间:2015-10-01 19:59:46

标签: c linux gtk

我尝试根据文件中的行数创建按钮, 每个按钮都会打印行内容 这是我的代码:

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);
}
我得到的只是 行内容

我怀疑这是因为我将具有不同参数的信号连接到同一个按钮(按钮名称不会改变:()

我需要保持这种动态,文件内容改变很多,我需要根据行数创建按钮,并使用这些按钮在相应的行上执行功能。

感谢。

1 个答案:

答案 0 :(得分:1)

您的假设部分正确。信号处理程序的格式是

return-type function-name(Type *sender, extra arguments, gpointer user_data)

其中senderg_signal_connect()的第一个参数,user_datag_signal_connect()的最后一个参数。在GtkButton::clicked的情况下,没有额外的参数,返回类型为void,因此您的信号函数应具有以下签名:

void type(GtkButton *b, gpointer data)

您可以将data投射到char *进行打印。

话虽这么说,你的程序永远不会像书面那样工作。当您将line传递给g_signal_connect()时,您正在为每个连接提供相同的 line指针,该指针始终指向相同的缓冲。因此,每次fgets()时,以前在line中的行都会被替换。假设当信号处理程序运行时line没有超出范围,您将只获得每个按钮的最后一行。如果line 超出范围,行为未定义

正确的做法是为信号处理程序提供行的副本。您可以使用g_strdup()执行此操作。请记住,您有责任释放这些副本。