Lui*_*BOL 6 gtk vala application-development
我需要在 Vala 中使用 Gtk 制作一个应用程序,该应用程序支持可由用户更改的键盘加速器。
首先,我向全局 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;
}
Run Code Online (Sandbox Code Playgroud)
我用:
valac main.vala -o main --pkg gtk+-3.0
Run Code Online (Sandbox Code Playgroud)
编译源代码。
所以,问题是:代码中缺少什么?我想我需要做点别的,但我不知道是什么。
您能否澄清一下您是否需要助记符(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
Run Code Online (Sandbox Code Playgroud)
和
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);
Run Code Online (Sandbox Code Playgroud)
这似乎可以解决问题。
我希望它有帮助。问候 TLE
| 归档时间: |
|
| 查看次数: |
4712 次 |
| 最近记录: |