Как мне действовать только на события клавиатуры, которые не нужны другим виджетам? - PullRequest
1 голос
/ 09 ноября 2011

Мой сканер штрих-кода действует как клавиатура, извергающая строки цифр. Я хочу, чтобы он работал все время, поэтому я не использую текстовую запись, а подключаюсь к событию нажатия клавиши в моем окне. К сожалению, это также испускается, когда другие текстовые записи имеют фокус. AFAIK, потому что окна сначала получают события, проверяют ярлыки, а затем передают их. Что-нибудь распространяется обратно в окно, если ни один виджет не обрабатывает их?

Ответы [ 2 ]

2 голосов
/ 12 ноября 2011

Я вставлю краткое изложение того, как работает gtk_window_key_press_event ():

gboolean
gtk_window_propagate_key_event (GtkWindow        *window,
                                GdkEventKey      *event)
{
  gboolean handled = FALSE;

  focus = window->focus_widget;

  while (!handled)
    {
      GtkWidget *parent;

      handled = gtk_widget_event (focus, event);
      focus = gtk_widget_get_parent (focus);
    }

  return handled;
}

static gint
gtk_window_key_press_event (GtkWidget   *widget,
                GdkEventKey *event)
{
  GtkWindow *window = GTK_WINDOW (widget);
  gboolean handled = FALSE;

  /* handle mnemonics and accelerators */
  if (!handled)
    handled = gtk_window_activate_key (window, event);

  /* handle focus widget key events */
  if (!handled)
    handled = gtk_window_propagate_key_event (window, event);

  /* Chain up, invokes binding set */
  if (!handled)
    handled = GTK_WIDGET_CLASS (gtk_window_parent_class)->key_press_event (widget, event);

  return handled;
}

Это в основном означает:

  1. Проверьте, подходит ли ключ для мнемоники (т.е. надписи с подчеркиванием) или ускорителя (от GtkAccelGroup).

  2. Начиная с сфокусированного виджета и поднимаясь вверх по иерархии контейнеров, посмотрите, обрабатывает ли какой-нибудь виджет нажатие клавиши.

  3. Передайте нажатие клавиши родительскому классу GtkWindow. Ближайший родительский элемент, который обрабатывает это GtkWidget, и он делает это, имея дело с привязками (из gtk_binding_entry_add ()).

Как вы сказали, простое выполнение g_signal_connect () для сигнала события нажатия клавиши GtkWindow даст вам всех нажатий клавиш, которые происходят, когда это окно сфокусировано.

Попробуйте вместо этого выполнить g_signal_connect_after (). Это эффективно добавит еще один запасной вариант к приведенной выше последовательности - это означает «запустить мой обработчик сигнала после используемого по умолчанию». Обратите внимание, что вы будете ловить все необработанные нажатия клавиш (например, если кто-то нажимает функциональную клавишу, которую ваше приложение не обрабатывает), поэтому не думайте, что единственное, что доходит до вашего обработчика, это с вашего сканера штрих-кода.

0 голосов
/ 26 июля 2013

попытайтесь настроить сканер штрих-кода для отправки, скажем, цифры ALT (или аналогичной), а не цифры для номера штрих-кода, это поможет при этой фильтрации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...