使用 signal_connect 在 C 中更改 GTK 标签

Changing GTK label in C using signal_connect

您好,我正在 GTK 中制作 GUI 我有一些菜单项,我试图在特定菜单元素上单击鼠标后更改主标签。

widgets[i][0] = gtk_menu_item_new_with_label(arrayOfStrings[i]);
//arrayOfStrings is : char** arrayOfStrings
gtk_menu_shell_append(GTK_MENU_SHELL(indicator_menu), widgets[i][0]);

我正在尝试这个:

void set_main_label(GtkWidget *widget)
{
    app_indicator_set_label(indicator, arrayOfString[2],arrayOfString[2]);
}

然后我这样称呼它:

g_signal_connect(widgets[i][0], "activate",G_CALLBACK(set_main_label), widgets[i][0]);

但我的问题是 void set_main_label(void) 必须有 void 参数。我需要将存储在 arrayOfStrings 中的字符串 (char*) 传递给那里。你有什么建议?现在我只能将标签更改为 set_main_label 函数中设置的一个特定字符串,但我不能将它作为参数传递给函数,你有什么建议? .

这就是 user_data 参数的用途。 set_main_label() 没有 void 参数列表 - 检查 documentation:

void
user_function (GtkMenuItem *widget,
               gpointer     user_data)

您可以通过 user_data 参数将您喜欢的任何参数传递给回调。但是必须在你连接信号的时候知道。

所以你可以这样做:

void
set_main_label(GtkMenuItem *widget, gpointer user_data)
{
    const char *label = (const char *)user_data;
    app_indicator_set_label(indicator, label, label);
}

g_signal_connect(widgets[i][0], "activate",
    G_CALLBACK(set_main_label), arrayOfString[2]);