C++ 连接Gtk和x2B中的关键加速器;(gtkmm)

C++ 连接Gtk和x2B中的关键加速器;(gtkmm),c++,gtk,keyboard-shortcuts,gtkmm,C++,Gtk,Keyboard Shortcuts,Gtkmm,我一直在使用gtkmm编写一个Gtk+应用程序,并试图添加一个调用回调的全局键盘快捷键。不幸的是,Gtk::AccelGroup的connect()方法在gtkmm中不可用,显然是有意的,因为您可以使用ActionGroups建立连接 无论如何,我有以下代码: actions_= Gtk::ActionGroup::create(); actions_->set_accel_group(Gtk::AccelGroup::create()); actions_->add( G

我一直在使用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());
actions\=Gtk::ActionGroup::create();
操作->设置加速组(Gtk::AccelGroup::create());
操作->添加(
Gtk::Action::create(“新建”),Gtk::AccelKey(“n”),
sigc::mem\u-fun(这个和窗口::新的缓冲区)
);
_gtk_window().添加_accel_组(操作->获取_accel_组());
它编译并运行时不会发出警告,但键盘快捷键不起任何作用。我已经摆弄这个好几个小时了,所以任何帮助或指导都将不胜感激


我是不是做错了什么?为什么加速器不能工作?

回答这个问题有点晚了,但我今天一直在研究同一个问题,即使是在不同的环境中: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)
actiongroup=gtk.actiongroup('window-clip-actions'))
accelgroup=gtk.accelgroup()
假工具栏=gtk.toolbar()
view.get_window().添加_accel_组(accelgroup)
view.get_window().get_content_area().pack_start(假工具栏)
对于快捷方式,cb in(('c',self.on\u window\u clip\u copy),
('v',self.on_window_clip_paste)):
action=gtk.action(快捷方式,快捷方式,'clip action',无)
actiongroup.add_action_with_accel(动作,快捷方式)
动作。连接(“激活”,cb)
动作。设置加速组(加速组)
操作。连接加速器()
toolitem=操作。创建工具项()
假工具栏.插入(toolitem,-1)
假工具栏。设置可见(假)

如果知道同样的方法是否有助于操作,那将很有趣。

在阅读了Marioto的答案后,下面是我为gtkmm3实现的隐藏菜单栏

快捷键加速器适用于隐藏菜单栏:)

#包括
#包括
使用Gtk::应用程序;
使用Gtk::Box;
使用Gtk::Builder;
使用Gio::SimpleActionGroup;
使用std::cout;
类示例窗口:公共Gtk::窗口
{
公众:
示例窗口(const Glib::RefPtr和app);
私人:
在_action_file_new()上无效;
//隐藏菜单栏
行动与秘密()无效;
盒子1;
盒子2;
Glib::RefPtr生成器;
Glib::RefPtr行动小组;
};
ExampleWindow::ExampleWindow(const Glib::RefPtr&app)
:框1(Gtk::方向\垂直)
,第2框(Gtk::方向\垂直)
{
设置标题(“菜单栏测试”);
设置默认大小(400200);
添加(框1);
第1栏。添加(第2栏);
//定义操作:
actiongroup=Gio::SimpleActionGroup::create();
actiongroup->add_action(“new”,sigc::mem_fun(*this,&ExampleWindow::on_action_file_new));
actiongroup->add_action(“secret”,sigc::mem_fun(*this,&ExampleWindow::on_action_secret));
插入行动组(“示例”,行动组);
插入行动组(“隐藏示例”,行动组);
builder=Gtk::builder::create();
app->set_accel_for_action(“example.new”、“n”);
app->set_accel_for_action(“example hidden.secret”、“m”);
常量字符*可见的用户界面信息=
""
"  "
"    "
“\u文件”
"      "
"        "
“_New”
“示例。新”
“Primaryn”
"        "
"      "
"    "
"  "
"";
常量字符*隐藏的用户界面信息=
""
"  "
"    "
“_秘密”
"      "
"        "
“_键”
“隐藏的示例。秘密”
“Primarym”
"        "
"      "
"    "
"  "
"";
生成器->从\u字符串添加\u(可见\u ui\u信息);
生成器->从\u字符串添加\u(隐藏的\u用户界面\u信息);
//获取可见菜单栏:
自动对象1=builder->get_对象(“可见菜单栏”);
auto-gmenu1=Glib::RefPtr::cast\u-dynamic(object1);
自动菜单1=Gtk::使_受管理(gmenu1);
框1.包装开始(*菜单1,Gtk::包装收缩);
//获取隐藏菜单栏
自动对象2=builder->get_对象(“隐藏菜单栏”);
auto-gmenu2=Glib::RefPtr::cast\u-dynamic(object2);
自动菜单R2=Gtk::使_受管理(gmenu2);
框2.包装开始(*菜单2,Gtk::包装收缩);
显示所有子项();
box2.hide();
}
void ExampleWindow::on_action_file_new()
{

我可以试试这个,但也不能让它做任何事情-但我不知道这是否是推荐的方式做它,我只是贴批发,所以如果有什么遗漏,我不会知道它是什么!这个评论的真正原因是,因为这是相当高的谷歌的东西,如GTKmm键盘快捷键,为真的ders-从GTKmm 3.10开始,
ActionGroup
似乎已被弃用,快速搜索表明它已被最近的
Gio
(glibmm)命名空间中类似命名的类所取代。也许你在那里会更幸运。