我正在尝试为我的gtkmm textview程序添加一个Ctrl + F加速器。我已经在gtk Entry字段中实现了搜索功能,所以我唯一需要的是在按下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:
好吧,我设法通过检查state和keyval参数使用“on_key_press_event”处理程序而没有加速器。希望这有助于一些人至少^^。
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;
}
如果有加速器,我仍然会对加速器的解决方案感兴趣!问候