我根据所选句子中的单词,在树形视图中使用右键单击创建弹出上下文菜单。代码:
//---- inpropper ------------
gboolean
menu_RELEASE(GtkWidget *menu, gpointer *user_data)
{
printf("released at %s\n", (char*)user_data);
return FALSE;
}
//---------------------------
//---- propper [SOLVED] -----
gboolean
menu_RELEASE(GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
gtk_entry_set_text(GTK_ENTRY(entry1), (char*)user_data);
gtk_widget_grab_focus(entry1);
return FALSE;
}
//--------------------------
GtkWidget *create_art_menu(GtkWidget *button)
{
char *ntext;
treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
if (gtk_tree_selection_get_selected(treesel, &model ,&iter))
{
gtk_tree_model_get(model, &iter, cNaziv, &ntext, -1);
GtkWidget *menu, *menu_item;
menu = gtk_menu_new();
char *sresult = NULL;
sresult = strtok(ntext, " ");
while(sresult != NULL)
{
if (strlen(sresult)>1)
{
menu_item = gtk_menu_item_new_with_label(sresult);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
g_signal_connect(G_OBJECT(menu_item), "button-release-event", G_CALLBACK(menu_RELEASE), (gpointer)sresult);
}
sresult = strtok(NULL, " ");
}
gtk_menu_attach_to_widget(GTK_MENU(menu), button, NULL);
gtk_widget_show_all(menu);
return menu;
}
return 0;
}
触发信号并传递OK但我无法从user_data获取menu_RELEASE处理程序中的单击菜单项字符串,这是我需要进一步操作的。
问:如何根据显示的代码在menu_RELEASE处理程序中获取已发布菜单项的字符串。
答案 0 :(得分:3)
原因是连接到button-release-event
的回调签名不正确。签名应为gboolean user_function(GtkWidget *widget,GdkEvent *event, gpointer user_data)
。尝试将gboolean menu_RELEASE(GtkWidget *menu, gpointer *user_data)
更改为gboolean menu_RELEASE(GtkWidget *menu, GdkEvent *event, gpointer *user_data)
或者,您可以使用g_signal_connect_swapped
代替g_signal_connect
&将gboolean menu_RELEASE(GtkWidget *menu, gpointer *user_data)
更改为gboolean menu_RELEASE(gpointer *user_data)
另外,要警惕@Joachim Pileborg已经提到的有关strtok
的内容
希望这有帮助!
答案 1 :(得分:1)
strtok
函数返回的结果是一个指向内部静态缓冲区的指针,它将在每次调用时被覆盖。如果您想保存结果以供日后使用,则必须创建副本(例如使用strdup
功能)。
但请注意,这样做需要你在使用它时释放新的字符串。例如,如果删除菜单项,则还需要释放此缓冲区。