在 Gtk+ (gtkmm) 中连接按键加速器

Kaz*_*ade 5 c++ gtk keyboard-shortcuts gtkmm

我一直在使用 gtkmm 编写 Gtk+ 应用程序,并且我正在尝试添加一个全局键盘快捷键来调用回调。不幸的是,gtkmm 中没有 Gtk::AccelGroup 的 connect() 方法,这显然是故意的,因为您可以使用 ActionGroups 进行连接...

无论如何,我有以下代码:

actions_= Gtk::ActionGroup::create();
actions_->set_accel_group(Gtk::AccelGroup::create());

actions_->add(
    Gtk::Action::create("new"), Gtk::AccelKey("<control>n"),
    sigc::mem_fun(this, &Window::new_buffer_thing)
);

_gtk_window().add_accel_group(actions_->get_accel_group());
Run Code Online (Sandbox Code Playgroud)

它在没有警告的情况下编译和运行,但键盘快捷键什么也不做。我一直在摆弄这个好几个小时,所以任何帮助或指导将不胜感激!

我做错了什么吗?为什么加速器不起作用?

mar*_*omo 1

回答这个问题有点晚了,但我今天一直在解决同样的问题,即使在不同的环境中:python,gtk2。

据我通过对本教程的一些实验了解到,除非与工具箱或菜单栏相关联,否则操作不会处于活动状态。太糟糕了,就这样做,将工具栏打包到 VBox 中,并使其不可见,如下所示:

actiongroup = gtk.ActionGroup('window-clip-actions')
accelgroup = gtk.AccelGroup()
fake_toolbar = gtk.Toolbar()
view.get_window().add_accel_group(accelgroup)
view.get_window().get_content_area().pack_start(fake_toolbar)
for shortcut, cb in (('<ctrl><shift>c', self.on_window_clip_copy),
                     ('<ctrl><shift>v', self.on_window_clip_paste)):
    action = gtk.Action(shortcut, shortcut, 'clip-action', None)
    actiongroup.add_action_with_accel(action, shortcut)
    action.connect("activate", cb)
    action.set_accel_group(accelgroup)
    action.connect_accelerator()
    toolitem = action.create_tool_item()
    fake_toolbar.insert(toolitem, -1)
fake_toolbar.set_visible(False)
Run Code Online (Sandbox Code Playgroud)

知道同样的方法是否对OP有帮助会很有趣。