如何在 FLTK 中远离 Fl_Button?

Posted

技术标签:

【中文标题】如何在 FLTK 中远离 Fl_Button?【英文标题】:How can I tab away from a Fl_Button in FLTK? 【发布时间】:2020-05-05 02:18:29 【问题描述】:

我有一个自定义类CustomButton,它扩展了Fl_Button。在我的屏幕上有一堆 Fl_InputCustomButton 小部件,我希望能够使用 tab 按键在它们之间导航。在输入字段之间切换可以正常工作,但是一旦 CustomButton 获得焦点,我似乎无法离开它。

这是我的句柄函数

int CustomButton::handle ( int event )

  int is_event_handled = 0;
  switch (event)
  
    case FL_KEYBOARD:
      // If the keypress was enter, toggle the button on/off
      if (Fl::event_key() == FL_Enter || Fl::event_key() == FL_KP_Enter)
      
        // Do stuff...
      
      is_event_handled = 1;
      break;

    case FL_FOCUS:
    case FL_UNFOCUS:
      // The default Fl_Button handling does not allow Focus/Unfocus
      // for the button so mark the even as handled to skip the Fl_Button processing
      is_event_handled = 1;
      break;

    default:
      is_event_handled = 0;
      break;
  

  if ( is_event_handled == 1 ) return 1;
  return Fl_Round_Button::handle ( event );

我使用的是 fltk 1.1.10。

【问题讨论】:

【参考方案1】:

有关演示如何控制焦点的非常简单的最小示例,请查看navigation.cxx 测试文件。

也许您的小部件确实获得了焦点(使用 Fl::focus() 检查),但它没有显示出来(您需要处理 FL_FOCUS 和/或 FL_UNFOCUS 事件)?

【讨论】:

我注释掉了我的CustomButton::handle() 函数并将事件传递给Fl_Button::handle(),但我仍然无法离开CustomButton。我可以看到CustomButton 在我进入它时确实有焦点,但它不会放开。我应该注意我正在使用 fltk 1.1.10 看起来Fl_Group::handle() 从来没有进入按钮的FL_KEYBOARD 大小写,但它确实用于Fl_Input。该案例调用了navigation(navkey()),我猜需要调用它才能将焦点从CustomButton移开【参考方案2】:

我的问题是我的CustomButton::handle()FL_KEYBOARD 事件之后返回1 而没有实际使用Tab 键。

is_event_handled = 1 移动到 if 语句中让我只使用FL_Enter 按键,并让其他小部件(即控制导航的 Fl_Group)使用任何其他按键。

或者去掉 if 并替换为类似的东西

switch(Fl::event_key())

    case FL_Enter:
    case FL_KP_Enter:
        // Do stuff
        is_event_handled = 1;
        break;
    default:
        is_event_handled = 0;
        break;

【讨论】:

以上是关于如何在 FLTK 中远离 Fl_Button?的主要内容,如果未能解决你的问题,请参考以下文章

fltk 小部件顺序,按钮隐藏在另一个小部件下

将键盘事件注入 FLTK 时遇到问题

带有按钮回调的新窗口未在 fltk 中打开

试图在 C++ 中的 Fltk GUI 中单击鼠标右键

FLTK Fl_Choice 获取选中项

如何通过按 Fl_Button 更改 Fl_Window 的背景颜色