Я пишу приложение Gtk + с использованием gtkmm и пытаюсь добавить глобальное сочетание клавиш, которое вызывает обратный вызов. К сожалению, метод connect () в Gtk :: AccelGroup недоступен в 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.
насколько я понимаю из небольшого эксперимента с этот урок, действия не будут активны, если они не связаны с панелью инструментов или меню. Жаль, просто сделайте это, упакуйте панель инструментов в 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)
было бы интересно узнать, поможет ли такой же подход ФП.
Других решений пока нет …