Добавить акселератор 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;
}
Мне бы все равно было интересно решение с ускорителями, если оно есть! Привет