循环创建、连接信号到按钮

creating, connecting signal to button in a loop

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

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);
}

我得到的只是 行内容是

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

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

谢谢。

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

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

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

void type(GtkButton *b, gpointer data)

你可以将 data 转换为 char * 来打印它。


话虽如此,您的程序永远不会像编写的那样运行。当您将 line 传递给 g_signal_connect() 时,您为 each 连接提供了 same line 指针,这将始终指向相同的缓冲区。因此,每次 fgets() 时,原先在 line 中的行都会被替换。假设当您的信号处理程序执行 运行 时 line 没有超出范围,您将只获得每个按钮的最后一行。如果 line 超出范围,行为未定义

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