2011-12-15 64 views
0

我使用rightclick在树视图中根据所选句子中的单词创建弹出右键菜单。代码:Gtk,使用user_data传递字符串

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

信号被触发,并将确定的,但我不能从USER_DATA我需要采取进一步行动menu_RELEASE处理器获得点击菜单项的字符串。

问:如何根据显示的代码获取menu_RELEASE处理程序中已释放菜单项的字符串。

回答

2

原因是连接到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)
Additonally,警惕什么@Joachim Pileborg已经提关于strtok的。
希望这有助于!

1

strtok函数返回的结果是一个指向内部静态缓冲区的指针,它将在每次调用时被覆盖。如果您想保存结果供以后使用,则必须创建一个副本(例如使用strdup函数)。

但要小心,这样做需要您在完成时释放新字符串。例如,如果您删除菜单项,则还需要释放此缓冲区。

+0

它是如此明显,我仍然与C基础的战斗?:)感谢您的建议,简单的解决方案,从第一个建议作品完美! – 2011-12-15 10:22:24

+0

@ user973238别担心。我们都是初学者。 :) – 2011-12-15 11:39:34