web-dev-qa-db-fra.com

Comment utiliser les accélérateurs dans Gtk?

Je dois créer une application dans Vala, à l'aide de Gtk, qui prend en charge les accélérateurs de clavier pouvant être modifiés par l'utilisateur.

Tout d'abord, j'ajoute une entrée au fichier global Gtk.AccelMap, puis définit le chemin_accélération pour le fichier Gtk.MenuItems. Mais ça ne marche pas. Les accels n'apparaissent pas dans les éléments de la barre de menu. Pour clarifier ce que j'essaie de faire, voici un exemple de code:

// 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;
}

J'utilise:

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

pour compiler le code source.

La question est donc: que manque-t-il dans le code? Je pense que je dois faire autre chose, mais je ne sais pas quoi.

7
LuisABOL

Pourriez-vous préciser si vous souhaitez des mnémoniques (raccourcis clavier pour les widgets d'interface graphique, c.-à-d. Ctrl-q) ou des accélérateurs (raccourcis clavier pour activer des éléments de menu, c.-à-d. Alt-f q). Autant que je sache, il s’agit de deux choses différentes. Par conséquent, définir un mnémonique pour un élément de menu ne constituera pas également un accélérateur.

Dans tous les cas, pour les accélérateurs, vous pouvez les créer en créant simplement vos éléments de menu avec une fonction différente: Gtk.MenuItem.with_mnemonic("_File"); au lieu de Gtk.MenuItem.with_label("File"). Il est ensuite redéfinissable avec par exemple la fonction file.set_label ('Fil_e')

Pour les mnémoniques, je ne sais pas exactement pourquoi cela ne fonctionne pas, car je suis totalement novice dans vala. Mais j’ai été capable d’empiler cet exemple c et de le faire fonctionner en utilisant des groupes d’accélérateurs au lieu de la carte des accélérateurs. Alors j'ai remplacé

// 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

avec

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);

et cela semble faire l'affaire.

J'espère que ça aide. Cordialement TLE

3
TLE