Översikt

Whenever you press or release a key, an event is emitted. You can add an event controller and connect a signal handler to handle such events.

The event signal handler will receive arguments that depend on the type of event. For key press events the arguments are (guint keyval, guint keycode, Gdk::ModifierType state). As described in the appendix, the key press event signal handler returns a bool value, to indicate that the signal is fully handled (true) or allow event propagation (false).

To determine which key was pressed or released, you read the value of the keyval argument and compare it with a constant in the https://gitlab.gnome.org/GNOME/gtk/tree/main/gdk/gdkkeysyms.h header file. The states of modifier keys (shift, ctrl, etc.) are available as bit-flags in state.

Här är ett enkelt exempel:

bool MyClass::on_key_pressed(guint keyval, guint, Gdk::ModifierType state)
{
  if (keyval == GDK_KEY_1 &&
    (state & (Gdk::ModifierType::SHIFT_MASK | Gdk::ModifierType::CONTROL_MASK |
     Gdk::ModifierType::ALT_MASK)) == Gdk::ModifierType::ALT_MASK)
  {
    handle_alt_press();
    return true;
  }
  return false;
}

// in MyClass constructor
auto controller = Gtk::EventControllerKey::create();
controller->signal_key_pressed().connect(
  sigc::mem_fun(*this, &MyClass::on_key_pressed), false);
add_controller(controller);

Exempel

I detta exempel finns det tre tangentbordsgenvägar: Alt+1 väljer den första radioknappen, Alt+2 väljer den andra, och Esc döljer (stänger) fönstret.

Keyboard Events - Simple

Källkod