如何在 Gtk 中使用加速器?

如何在 Gtk 中使用加速器?

我需要使用 Gtk 在 Vala 中制作一个应用程序,该应用程序支持可由用户更改的键盘加速器。

首先,我向全局 Gtk.AccelMap 添加一个条目,然后为 Gtk.MenuItems 设置 accel_path。但是,它不起作用。加速器没有出现在菜单栏的项目中。为了清楚说明我试图做什么,下面是示例代码:

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

编译源代码。

那么,问题是:代码中缺少什么?我想我需要做些其他事情,但我不知道做什么。

答案1

您能否澄清一下您想要的是助记符(用于 GUI 小部件的键盘快捷键,即 ctrl-q)还是加速器(用于激活菜单项的键盘快捷键,即 alt-f 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);

这似乎起了作用。

希望对您有帮助。问候 TLE

相关内容