1

我正在尝试将 Ctrl+F 加速器添加到我的 gtkmm textview 程序。我已经在 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);

我在这里尝试了一些东西,但我既不了解我需要在此处输入的参数,也不了解此方法的工作原理-ofc 它不起作用...

如果有人能向我解释这件事是如何正常工作的,我会非常高兴,并为我糟糕的英语感到抱歉。如果您需要任何事情,请告诉我。提前致谢

问候

编辑:我在 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 添加到窗口小部件,但我的程序中只有一个滚动窗口和框......现在我不知道如何继续...... :)

更新2:

好吧,我通过检查 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;
}

如果有的话,我仍然会对加速器的解决方案感兴趣!问候

4

0 回答 0