gtk_menu_popup() 删除树视图选择
gtk_menu_popup() removing treeview selection
我试图在 GtkTreeView 的某个项目收到右键单击时显示上下文菜单。当我右键单击该项目时,会显示菜单,但我的 GtkTreeView 中的选择消失了,我希望在显示 GtkMenu 时选中我右键单击的项目。
菜单是 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
我已经按照此处的示例进行操作 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()
before 我做了 GtkTreeSelection 部分但它不起作用。
有人可以帮我吗?
谢谢!
问题不在 gtk_menu_popup() 中。这是我用来填充树视图的信号。
g_signal_connect(win, "visibility-notify-event", G_CALLBACK(list_nfe),
NULL);
似乎在弹出菜单时再次发出信号,在调用函数 list_nfe()
时刷新树视图。
我试图在 GtkTreeView 的某个项目收到右键单击时显示上下文菜单。当我右键单击该项目时,会显示菜单,但我的 GtkTreeView 中的选择消失了,我希望在显示 GtkMenu 时选中我右键单击的项目。
菜单是 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
我已经按照此处的示例进行操作 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()
before 我做了 GtkTreeSelection 部分但它不起作用。
有人可以帮我吗?
谢谢!
问题不在 gtk_menu_popup() 中。这是我用来填充树视图的信号。
g_signal_connect(win, "visibility-notify-event", G_CALLBACK(list_nfe),
NULL);
似乎在弹出菜单时再次发出信号,在调用函数 list_nfe()
时刷新树视图。