Как использовать ускорители в Gtk?

Мне нужно создать приложение на Vala, использующее Gtk, которое поддерживает клавиатурные ускорители, которые могут быть изменены пользователем.

Сначала я добавляю запись в глобальный Gtk.AccelMap, а затем устанавливаю accel_path для Gtk.MenuItems. Но это не работает. Аксели не появляются в пунктах меню. Чтобы понять, что я пытаюсь сделать, вот пример кода:

// main.vala
public class MyWindow: Gtk.Window {
    public MyWindow() {
    this.set_default_size(500, 500);

    var main_box = new Gtk.VBox(false, 0);
    this.add(main_box);

    // Menubar
    var menubar = new Gtk.MenuBar();
    main_box.pack_start(menubar, false, false, 0);

    var file = new Gtk.MenuItem.with_label("File");
    menubar.add(file);

    var file_menu = new Gtk.Menu();
    file.set_submenu(file_menu);

    var quit_mi = new Gtk.MenuItem.with_label("Quit");
    file_menu.append(quit_mi);

    // Register a new accelerator with the global accelerator map
    Gtk.AccelMap.add_entry("<MyWindow>/File/Quit", 'Q', Gdk.ModifierType.CONTROL_MASK);
    quit_mi.set_accel_path("<MyWindow>/File/Quit");

    // Connect signals
    quit_mi.activate.connect(Gtk.main_quit);

    // Label
    var label = new Gtk.Label("My Window");
    main_box.pack_start(label, true, true, 0);

    this.destroy.connect(Gtk.main_quit);
    }
}

int main(string[] args) {
    Gtk.init(ref args);

    var win = new MyWindow();
    win.show_all();

    Gtk.main();
    return 0;
}

Я использую:

valac main.vala -o main --pkg gtk+-3.0

для компиляции исходного кода.

Итак, вопрос: чего не хватает в коде? Я думаю, что мне нужно сделать что-то еще, но я не знаю, что.

7
задан 9 April 2012 в 01:58

1 ответ

Не могли бы вы уточнить, хотите ли вы использовать мнемонику (сочетания клавиш для графических виджетов, например, ctrl-q) или ускорители (сочетания клавиш для активации пунктов меню, т.е. Насколько я понимаю, это две разные вещи, поэтому установка мнемоники для пункта меню также не создаст для него ускорителя.

В любом случае, для ускорителей вы можете сформировать их, просто создавая пункты меню с другой функцией: Gtk.MenuItem.with_mnemonic("_File"); вместо Gtk.MenuItem.with_label("File"). Затем его можно переопределить, например, с помощью функция file.set_label ('Fil_e')

Для мнемоники я не совсем уверен, почему она не работает, так как я совершенно новичок в vala. Но я смог собрать этого c-примера и заставить его работать, используя группы ускорителей вместо карты ускорителей. Поэтому я заменил

// Register a new accelerator with the global accelerator map
Gtk.AccelMap.add_entry("<MyWindow>/File/Quit", 'Q', Gdk.ModifierType.CONTROL_MASK);
quit_mi.set_accel_path("<MyWindow>/File/Quit");enter code here

на

var accel_group = new Gtk.AccelGroup();
this.add_accel_group(accel_group);
quit_mi.add_accelerator("activate", accel_group, 'R', Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE);

, и это, кажется, делает свое дело.

1110 Надеюсь, это поможет. С уважением, TLE

0
ответ дан 9 April 2012 в 01:58

Другие вопросы по тегам:

Похожие вопросы: