我正在尝试根据文件中的行数创建按钮, 每个按钮将打印行内容 这是我的代码:
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)
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()
执行此操作。请记住,您有责任释放这些副本。
关于循环创建、连接信号到按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32895861/