2016-12-31 24 views
0

GtkTreeViewの項目が右クリックを受け取ったときにコンテキストメニューを表示しようとしています。アイテムを右クリックすると、メニューが表示されますが、GtkTreeViewの選択が消えて、GtkMenuが表示されたときにアイテムを右クリックする必要があります。gtk_menu_popup()ツリービューの選択を削除する

メニューがGtkBuiltです:

... 
<object class="GtkMenu" id="menu_nf"> 
<property name="visible">True</property> 
<property name="can_focus">False</property> 
<child> 
    <object class="GtkMenuItem" id="abrir_nfe"> 
    <property name="visible">True</property> 
    <property name="can_focus">False</property> 
    <property name="label" translatable="yes">Abrir</property> 
    <property name="use_underline">True</property> 
    </object> 
</child> 
<child> 
    <object class="GtkMenuItem" id="emitir_nfe"> 
    <property name="visible">True</property> 
    <property name="can_focus">False</property> 
    <property name="label" translatable="yes">Emitir</property> 
    <property name="use_underline">True</property> 
    </object> 
</child> 
</object> 
... 

そして、これらは、私は、メニューを表示するために使用しています関連機能です:

static gint popup_menu_nfe(GtkTreeView *t, GdkEventButton *e, gpointer *win){ 
    gtk_menu_popup((LIVRENFE_WINDOW(win))->menu_nf, NULL, 
     NULL, NULL, NULL, e->button, e->time); 
} 

static gint nfe_context_menu_show(GtkTreeView *t, GdkEventButton *e, 
     gpointer win){ 
    if(e->type == GDK_BUTTON_PRESS){ 
     if(e->button == GDK_BUTTON_SECONDARY){ 
      GtkTreeSelection *s; 
      GtkTreePath *p; 
      s = gtk_tree_view_get_selection(t); 
      if(gtk_tree_view_get_path_at_pos(t, e->x, e->y, &p, 
        NULL, NULL, NULL)){ 
       gtk_tree_selection_unselect_all(s); 
       gtk_tree_selection_select_path(s, p); 
       gtk_tree_path_free(p); 
      } 
      popup_menu_nfe(t, e, win); 
      return TRUE; 
     } 
    } 
    return FALSE; 
} 

static gint nfe_on_popup(GtkTreeView *t, gpointer win){ 
    popup_menu_nfe(t, NULL, win); 
    return TRUE; 
} 

static void livrenfe_window_init(LivrenfeWindow *win){ 
    gtk_widget_init_template(GTK_WIDGET(win)); 
    ... 
    g_signal_connect((LIVRENFE_WINDOW(win))->treeview, "button-press-event", 
     G_CALLBACK(nfe_context_menu_show), win); 
    g_signal_connect((LIVRENFE_WINDOW(win))->treeview, "popup-menu", 
     G_CALLBACK(nfe_on_popup), win); 
    ... 
} 

全コードはここにある:https://github.com/pablogallardo/livrenfe/blob/master/src/lnfe_window.c

Iここの例に従いましたhttps://en.wikibooks.org/wiki/GTK%2B_By_Example/Tree_View/Events#Context_Menus_on_Right_Click

gtk_menu_popup()コールをコメントアウトすると、アイテムを右クリックするとアイテムが選択されますが、gtk_menu_popup()を呼び出すと何か問題が起きているようです。私もgtk_menu_popup()の前にのGtkTreeSelectionを実行しても動作しません。

誰かお手伝いできますか?

ありがとうございます!

答えて

0

問題はgtk_menu_popup()にありませんでした。それは、私がツリービューを作成するために使用していた信号でした。

g_signal_connect(win, "visibility-notify-event", G_CALLBACK(list_nfe), 
     NULL); 

メニューがポップアップされたときに信号が呼び出される関数list_nfe()としてのツリービューをリフレッシュ、再び放出されるようです。

関連する問題