Как я могу перейти от Fl_Button к FLTK? - PullRequest
1 голос
/ 05 мая 2020

У меня есть собственный класс CustomButton, расширяющий Fl_Button. На моем экране есть несколько виджетов Fl_Input и CustomButton, между которыми я хочу перемещаться с помощью клавиши табуляции. Табуляция между полями ввода работает нормально, но как только 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.

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Моя проблема заключалась в том, что я CustomButton::handle() возвращал 1 после события FL_KEYBOARD без фактического использования нажатия клавиши табуляции.

Перемещение 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;
}
0 голосов
/ 05 мая 2020

Для очень простого, минимального примера, демонстрирующего, как управлять фокусом, пожалуйста, проверьте navigation.cxx тестовый файл.

Возможно, ваш виджет действительно получил фокус (проверьте это с помощью Fl :: focus ()), но он этого не показывает (вам нужно обрабатывать события FL_FOCUS и / или FL_UNFOCUS)?

...