GtkCheckMenuItem 中未显示加速器
Accelerator not displayed in GtkCheckMenuItem
我目前在 GTK+3 中摆弄我的菜单栏。
到目前为止,我有一些带有标签和显示的加速器快捷方式的 CheckMenuItems:
GtkWidget *create_menubar(void)
{
GtkWidget *menubar = gtk_menu_bar_new();
const static guint num_keys[] = {GDK_KEY_1, GDK_KEY_2, GDK_KEY_3, GDK_KEY_4, GDK_KEY_5, GDK_KEY_6, GDK_KEY_7, GDK_KEY_8, GDK_KEY_9, GDK_KEY_0};
// Create a GtkAccelGroup and add it to the window.
GtkAccelGroup *accel_group = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(window_main), accel_group);
// submenu show colors
GtkWidget *colors_Mi = gtk_menu_item_new_with_label("colors");
GtkWidget *colors_Menu = gtk_menu_new();
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), colors_Mi);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(colors_Mi), colors_Menu);
for (int i = 0; i < NUM_COLORS; i++)
{
char name[10];
sprintf(name, "col %d", i+1);
// <<<<<<<<<<<<<<<<< cut mark...
GtkWidget *show_color_Mi = gtk_check_menu_item_new_with_label(name);
// <<<<<<<<<<<<<<<<< cut mark...
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(show_color_Mi), show_color[i]);
if (i < 10)
{
gtk_widget_add_accelerator(show_color_Mi, "activate", accel_group, num_keys[i], GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
}
gtk_menu_shell_append(GTK_MENU_SHELL(colors_Menu), show_color_Mi);
g_signal_connect(G_OBJECT(show_color_Mi), "toggled", G_CALLBACK(on_menu_show_colors_toggled), &show_color[i]);
}
return menubar;
}
到目前为止一切正常。
该程序以不同的颜色显示多组数据。
此菜单中的条目用于启用或禁用一组数据。
现在我想添加一些指示以哪种颜色绘制哪组数据。
为此,我更改了 MenuItem 的创建。
现在我创建一个水平框,其中包含图像和标签。
剪切标记之间的线 (<<<<<<<<<<<<) 替换为:
// <<<<<<<<<<<<<<<<<
GtkWidget *show_color_Mi = gtk_check_menu_item_new();
GtkWidget *menubox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
GtkWidget *image = gtk_image_new();
GtkWidget *menulabel = gtk_label_new(name);
cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 20, 15);
cairo_t *cr = cairo_create(surface);
cairo_set_source_rgb(cr, colors[i].r, colors[i].g, colors[i].b);
cairo_paint(cr);
cairo_destroy(cr);
gtk_image_set_from_surface(GTK_IMAGE(image), surface);
gtk_container_add(GTK_CONTAINER(show_color_Mi), menubox);
gtk_box_pack_start(GTK_BOX(menubox), image, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(menubox), menulabel, FALSE, FALSE, 0);
// <<<<<<<<<<<<<<<<<
现在我有了 CheckMenuItems,其中包含一个彩色矩形和与更改之前相同的文本。这是好事...
不好的是,由于某种原因,加速键不再显示。
对我做错了什么有什么建议吗?
编辑:
根据 José Fonte 的回答进行了更新,总的来说它是有效的。
但与此同时我发现了一些其他奇怪的效果。我 运行 在某些 Ubuntu 14.04 机器上使用 XFCE 运行我的程序,它按预期工作。我还在 VirtualBox 的 Ubuntu 16.04 中 运行 它,它也工作正常。但是在 VmWare 中的另一台 Ubuntu 14.04 机器上表现不同。彩色矩形不见了,但即使我使用了不正确的标签类型,加速器也会显示。这有点奇怪......
现在我检查了它在哪台机器上工作或不工作以及安装了哪个版本的 libgtk-3-bin:
Ubuntu 16.04 (VirtualBox)
3.18.9-1ubuntu3.1 OK
Raspbian杰西 (Raspberry Pi)
3.14.5-1+deb8u1rpi1rpig OK
Ubuntu 14.04,XFCE(本机)
3.10.8-0ubuntu1.6 OK
Ubuntu 14.04,Unity(VMware)
3.10.8-0ubuntu1.6 失败
你的问题是你使用的是普通的 GtkLabel 而不是 GtkAccelLabel。
你必须改成这样:
[stuff deleted]
...
GtkWidget *menulabel = gtk_accel_label_new(name);
gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(menulabel), show_color_Mi);
...
gtk_box_pack_start(GTK_BOX(menubox), menulabel, TRUE, TRUE, 0);
结论:使用 gtk_accel_label 而不是 gtk_label,然后设置应该是包含它的菜单项的加速小部件,并更改 gtk_box_pack_start 上的填充和展开标志允许额外 space。这应该可以解决您的问题。
我目前在 GTK+3 中摆弄我的菜单栏。 到目前为止,我有一些带有标签和显示的加速器快捷方式的 CheckMenuItems:
GtkWidget *create_menubar(void)
{
GtkWidget *menubar = gtk_menu_bar_new();
const static guint num_keys[] = {GDK_KEY_1, GDK_KEY_2, GDK_KEY_3, GDK_KEY_4, GDK_KEY_5, GDK_KEY_6, GDK_KEY_7, GDK_KEY_8, GDK_KEY_9, GDK_KEY_0};
// Create a GtkAccelGroup and add it to the window.
GtkAccelGroup *accel_group = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(window_main), accel_group);
// submenu show colors
GtkWidget *colors_Mi = gtk_menu_item_new_with_label("colors");
GtkWidget *colors_Menu = gtk_menu_new();
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), colors_Mi);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(colors_Mi), colors_Menu);
for (int i = 0; i < NUM_COLORS; i++)
{
char name[10];
sprintf(name, "col %d", i+1);
// <<<<<<<<<<<<<<<<< cut mark...
GtkWidget *show_color_Mi = gtk_check_menu_item_new_with_label(name);
// <<<<<<<<<<<<<<<<< cut mark...
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(show_color_Mi), show_color[i]);
if (i < 10)
{
gtk_widget_add_accelerator(show_color_Mi, "activate", accel_group, num_keys[i], GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
}
gtk_menu_shell_append(GTK_MENU_SHELL(colors_Menu), show_color_Mi);
g_signal_connect(G_OBJECT(show_color_Mi), "toggled", G_CALLBACK(on_menu_show_colors_toggled), &show_color[i]);
}
return menubar;
}
到目前为止一切正常。 该程序以不同的颜色显示多组数据。 此菜单中的条目用于启用或禁用一组数据。 现在我想添加一些指示以哪种颜色绘制哪组数据。
为此,我更改了 MenuItem 的创建。 现在我创建一个水平框,其中包含图像和标签。
剪切标记之间的线 (<<<<<<<<<<<<) 替换为:
// <<<<<<<<<<<<<<<<<
GtkWidget *show_color_Mi = gtk_check_menu_item_new();
GtkWidget *menubox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
GtkWidget *image = gtk_image_new();
GtkWidget *menulabel = gtk_label_new(name);
cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 20, 15);
cairo_t *cr = cairo_create(surface);
cairo_set_source_rgb(cr, colors[i].r, colors[i].g, colors[i].b);
cairo_paint(cr);
cairo_destroy(cr);
gtk_image_set_from_surface(GTK_IMAGE(image), surface);
gtk_container_add(GTK_CONTAINER(show_color_Mi), menubox);
gtk_box_pack_start(GTK_BOX(menubox), image, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(menubox), menulabel, FALSE, FALSE, 0);
// <<<<<<<<<<<<<<<<<
现在我有了 CheckMenuItems,其中包含一个彩色矩形和与更改之前相同的文本。这是好事...
不好的是,由于某种原因,加速键不再显示。
对我做错了什么有什么建议吗?
编辑:
根据 José Fonte 的回答进行了更新,总的来说它是有效的。 但与此同时我发现了一些其他奇怪的效果。我 运行 在某些 Ubuntu 14.04 机器上使用 XFCE 运行我的程序,它按预期工作。我还在 VirtualBox 的 Ubuntu 16.04 中 运行 它,它也工作正常。但是在 VmWare 中的另一台 Ubuntu 14.04 机器上表现不同。彩色矩形不见了,但即使我使用了不正确的标签类型,加速器也会显示。这有点奇怪......
现在我检查了它在哪台机器上工作或不工作以及安装了哪个版本的 libgtk-3-bin:
Ubuntu 16.04 (VirtualBox) 3.18.9-1ubuntu3.1 OK
Raspbian杰西 (Raspberry Pi) 3.14.5-1+deb8u1rpi1rpig OK
Ubuntu 14.04,XFCE(本机) 3.10.8-0ubuntu1.6 OK
Ubuntu 14.04,Unity(VMware) 3.10.8-0ubuntu1.6 失败
你的问题是你使用的是普通的 GtkLabel 而不是 GtkAccelLabel。
你必须改成这样:
[stuff deleted]
...
GtkWidget *menulabel = gtk_accel_label_new(name);
gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(menulabel), show_color_Mi);
...
gtk_box_pack_start(GTK_BOX(menubox), menulabel, TRUE, TRUE, 0);
结论:使用 gtk_accel_label 而不是 gtk_label,然后设置应该是包含它的菜单项的加速小部件,并更改 gtk_box_pack_start 上的填充和展开标志允许额外 space。这应该可以解决您的问题。