Добавить акселератор Ctrl+F для текстового поиска

Я пытаюсь добавить ускоритель Ctrl+F в мою программу просмотра текста gtkmm. Я уже реализовал функцию поиска в поле ввода gtk, поэтому единственное, что мне нужно, - это сфокусировать запись поиска при нажатии Ctrl+F.

Я погуглил и проверил учебники / справочник по gtkmm (2.4, я работаю с этим), но единственное, что я нашел, это ускорители в контексте меню и панелей инструментов, использующих UIManager, которого у меня нет в этом файле.cc, который я использую (и я не могу добавить их, потому что это существующая программа).

Я пытался добавить действие с помощью AccelKey для кнопки или пробовал функцию add_accelerator(), но я не смог их правильно использовать (я довольно новичок в gtkmm и не хватает образцов - по крайней мере, ни одного из них я не понимаю), Вот несколько примеров, которые я попробовал:

  _gtkActionGroup->add(
    Gtk::Action::create("find", "Find", "search in file"),
    Gtk::AccelKey("<control>F"),
    sigc::mem_fun(this, &SrcFilesView::onGtkTxtFindAccKeyPressed));

Я не знал, как добавить это действие к кнопке (на панели инструментов), которую я создал...

  _gtkAccelGroup(Gtk::AccelGroup::create()) //initialized  in the constructor of the class
 ...
  _gtkBtnFind.add_accelerator("find", _gtkAccelGroup, GDK_Find, 
    Gdk::ModifierType::CONTROL_MASK, Gtk::ACCEL_VISIBLE);

Я попробовал здесь кое-что, но я действительно не понимал ни параметры, которые мне нужно было ввести здесь, ни как этот метод работает - конечно, он не работал...

Я был бы очень рад, если бы кто-нибудь мог объяснить мне, как все это работает должным образом, и извините за мой плохой английский. Если есть какие-то вещи, которые вам нужны, просто скажите мне, пожалуйста. заранее спасибо

Привет

редактировать: я посмотрел в источниках GTK и попытался понять параметры add_accelerator. Сейчас я попробовал это, но все еще не работает...:

  _gtkBtnFind.add_accelerator("clicked", _gtkAccelGroup, GDK_KEY_F /* or better GDK_KEY_f ?*/, 
    Gdk::ModifierType(GDK_CONTROL_MASK), Gtk::AccelFlags(GTK_ACCEL_VISIBLE));
  _gtkBtnFind.signal_clicked().connect(
    sigc::mem_fun(this, &SrcFilesView::onGtkTxtFindAccKeyPressed));

ОБНОВИТЬ:

Хорошо, теперь я понял больше всего, я думаю, и я знаю, почему это не работает. Проблема в том, что мне нужно добавить accel_group в виджет окна, но я получил только прокручиваемое окно и поля в моей программе.... и теперь я понятия не имею, как продолжить...:)

UPDATE2:

Хорошо, мне удалось сделать это без ускорителей, используя обработчик on_key_press_event, проверив параметр state и keyval. Надеюсь, это поможет некоторым людям по крайней мере ^^.

bool on_key_press_event(GdkEventKey* event) { /* declaration in my constructor removed */
  if(event->state == GDK_CONTROL_MASK && event->keyval == GDK_KEY_f
    || event->state == (GDK_CONTROL_MASK | GDK_LOCK_MASK) 
       && event->keyval == GDK_KEY_F) {
    _gtkEntFind.grab_focus();
  }
  return false;
}

Мне бы все равно было интересно решение с ускорителями, если оно есть! Привет

0 ответов

Другие вопросы по тегам