如何在 GTK 中监控按键?

问题描述 投票:0回答:1

我希望在我的程序中捕获按键,但遇到了困难。

  1. 我正在从这个答案开始工作:How do I Check for the Key Pressed in GTK3 (C)?(最后一个答案)
  2. 我将
    GtkEventControllerKey
    换成了
    GtkEventKey
    ,我知道这是现在正确的方法。

这是我的代码:

void on_window_main_key_press_event(GtkWidget *widget, GtkEventControllerKey *key, gpointer user_data) {
    guint TheKeyThatWasPressed = key->keyval;
}

这会产生错误:

error: invalid use of incomplete typedef ‘GtkEventControllerKey’ {aka ‘struct _GtkEventControllerKey’}
  147 |     guint TheKeyThatWasPressed = key->keyval;
c gtk gtk4
1个回答
0
投票
include <gtk/gtk.h>

static gboolean on_key_pressed(GtkEventControllerKey *controller,` 
                           guint keyval,
                            guint keycode,
                            GdkModifierType state,
                            gpointer user_data)
{
    gunichar unicode = gdk_keyval_to_unicode(keyval);
    gchar *letter = g_ucs4_to_utf8(&unicode, 1, NULL, NULL, NULL);

    g_print("kayval: %u\n", keyval);
    g_print("keycode: %u\n",keycode);
    g_print("letter pressed: %s\n", letter);

    g_free(letter);

    return GDK_EVENT_PROPAGATE;
}


static void
activate (GtkApplication *app,
          gpointer        user_data)
{
  GtkWidget *window;

  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

  GtkEventController*  keyevent = gtk_event_controller_key_new ();
  gtk_widget_add_controller(window,keyevent);

  g_signal_connect(keyevent,"key-pressed",G_CALLBACK(on_key_pressed),NULL);

  gtk_window_present (GTK_WINDOW(window));
}

int
main (int    argc, char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("org.gtk.example",   G_APPLICATION_DEFAULT_FLAGS);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status; 
}
© www.soinside.com 2019 - 2024. All rights reserved.