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

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

我得到的只是 行内容是

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

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

谢谢。

最佳答案

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

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() 执行此操作。请记住,您有责任释放这些副本。

关于循环创建、连接信号到按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32895861/

相关文章:

c - C 中的全局变量链表队列? (初始化元素不是常量)

node.js - 我的 express https 服务器在本地工作但不在 docker 容器中

gtk - Gdk/X11 屏幕截图

linux - 在 GTK 中查找进程的所有打开窗口

c - XML 文档如何与 GTK 一起工作来创建用户界面?

c - 如何在C程序中列出目录中的文件?

c - F11 和 F12 的 Windows 扫描码不同。为什么?

linux - Grep 文本的特定部分

linux - ls | grep 变量作为正则表达式

c - autotools中不同文件的不同实现