我一直在使用 gtkmm 编写一个 Gtk+ 应用程序,我正在尝试添加一个调用回调的全局键盘快捷键。不幸的是,Gtk::AccelGroup 的 connect() 方法在 gtkmm 中不可用,这显然是故意的,因为您可以使用 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());
编译和运行时没有警告,但键盘快捷键不执行任何操作。几个小时以来我一直在摆弄这个,所以任何帮助或指导将不胜感激!
我做错了什么吗?为什么加速器不起作用?
最佳答案
回答这个问题有点晚了,但我今天一直在处理同样的问题,即使在不同的环境中:python、gtk2。
据我对 this tutorial 的一些小实验了解,除非关联到工具箱或菜单栏,否则操作将不会激活。太糟糕了,就这样做吧,将工具栏打包到 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)
了解相同的方法是否有助于 OP 会很有趣。
关于c++ - 在 Gtk+ (gtkmm) 中连接关键加速器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19653295/