Wie benutze ich Beschleuniger in Gtk?

6

Ich muss mit Gtk eine Anwendung in Vala erstellen, die Tastaturbeschleuniger unterstützt, die vom Benutzer geändert werden können.

Zuerst füge ich der globalen Gtk.AccelMap einen Eintrag hinzu und setze dann den accel_path für die Gtk.MenuItems. Aber es funktioniert nicht. Die Beschleunigungen erscheinen nicht in den Elementen der Menüleiste. Um zu verdeutlichen, was ich versuche, ist hier ein Beispielcode:

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

Ich benutze:

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

um den Quellcode zu kompilieren.

Die Frage ist also: Was fehlt im Code? Ich denke, ich muss etwas anderes tun, aber ich weiß nicht was.

LuisABOL
quelle

Antworten:

4

Könnten Sie bitte klarstellen, ob Sie Mnemonik (Tastaturkürzel für GUI-Widgets, z. B. Strg-Q) oder Beschleuniger (Tastaturkürzel zum Aktivieren von Menüelementen, z. B. Alt-F Q) möchten? Soweit ich weiß, handelt es sich dabei um zwei verschiedene Dinge. Wenn Sie also eine Mnemonik für einen Menüpunkt festlegen, wird dies auch keinen Beschleuniger darstellen.

In jedem Fall können Sie die Beschleuniger bilden, indem Sie einfach Ihre Menüelemente mit einer anderen Funktion erstellen: Gtk.MenuItem.with_mnemonic("_File");anstelle von Gtk.MenuItem.with_label("File"). Es kann dann zB mit der Funktion file.set_label ('Fil_e') neu definiert werden

Für die Mnemonik bin ich mir nicht ganz sicher, warum es nicht funktioniert, da ich für Vala völlig neu bin. Aber ich konnte dieses C-Beispiel huckepack nehmen und es mit Beschleunigergruppen anstelle der Beschleunigerkarte zum Laufen bringen. Also habe ich ersetzt

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

mit

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

und das scheint den Trick zu tun.

Ich hoffe, es hilft. Grüße TLE

TLE
quelle
1
Sie haben die Bedeutung der Wörter umgekehrt: Was Sie als Beschleuniger bezeichnet haben, ist eigentlich eine Mnemonik und umgekehrt.
LuisABOL
Ich habe bereits versucht, das zu tun, was Sie vorgeschlagen haben, aber ich möchte wissen, wie eine AccelMap zum Laden der Beschleuniger verwendet wird.
LuisABOL
Ahh, ich habe den Wortlaut auf dieser Seite befolgt . Auf jeden Fall denke ich, dass es immer noch einige Verwirrung gibt. Sie möchten Beschleuniger (als allgemeine Verknüpfung zum Aktivieren eines Widgets freigegeben), fragen aber gleichzeitig, warum keine Mnemonik angezeigt wird. Ich glaube nicht, dass diese miteinander verknüpft sind. Was würde dann passieren, wenn Sie mit einem Schlüssel (Buchstaben), der nicht auf dem Etikett steht, einen Beschleuniger für ein Menü erstellen? Auf jeden Fall bedauere ich, Ihnen nicht helfen zu können, da ich nicht viel über die Beschleunigerkarten weiß. Viel Glück.
TLE