2017-04-07 20 views
1

我目前在GTK + 3中使用我的菜單欄很受歡迎。 到現在爲止我有一些CheckMenuItems帶標籤和顯示加速器快捷方式:加速器不顯示在GtkCheckMenuItem中

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在我改變之前。這是件好事...

不好的一點是,由於某些原因,加速鍵不再顯示。

有什麼建議我做錯了嗎?

編輯:

在根據何塞·馮特的答案,並在總體上工作的更新。 但在此期間,我發現了一些其他奇怪的影響。我正在使用XFCE在一些Ubuntu 14.04機器上運行我的程序,並按預期工作。我也在VirtualBox的Ubuntu 16.04中運行它,它也可以正常工作。但在VmWare的另一臺Ubuntu 14.04機器上表現出不同。即使使用錯誤的標籤類型,也會顯示顏色的矩形,但會顯示加速器。這是有點怪異......

現在我在它的工作原理或沒有哪臺機器和安裝的是哪個libgtk-3槽的版本檢查:

的Ubuntu 16.04(VirtualBox的) 3.18.9-1ubuntu3 0.1

Raspbian傑西(樹莓PI) 3.14.5-1 + deb8u1rpi1rpig

Ubuntu的14.04,XFCE(天然) 3.10.8-0ubuntu1.6 OK

的Ubuntu 14.04,統一(在VmWare) 3.10.8-0ubuntu1.6 失敗

回答

1

您的問題是,您使用的是正常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上允許額外的空間。這應該可以解決你的問題。

+0

非常感謝這暗示!它確實有幫助。但它也造成一些混亂。我的印象是加速器是菜單項的一個特徵,而不是它的封閉元素。如果我做對了,我總是需要一個標籤。如果我只想要沒有任何文字的彩色矩形,我仍然需要一個accel_label來指示加速器。這是一個有點對我一個驚喜的...... – Gerhardh

+0

你是對的,但如果你想加速的文本表示,那麼你將需要一個標籤,在這種特殊情況下,一個accel_label。 –

+0

在此期間,我發現了一些其他奇怪的效果。我正在使用XFCE在一些Ubuntu 14.04機器上運行我的程序,並按預期工作。我也在VirtualBox的Ubuntu 16.04中運行它,它也可以正常工作。但在VmWare的另一臺Ubuntu 14.04機器上表現出不同。即使使用錯誤的標籤類型,也會顯示顏色的矩形,但會顯示加速器。這是越來越奇怪... – Gerhardh