【问题标题】:In GTK3, how do I get a DrawingArea to respond keyboard events?在 GTK3 中,如何让 DrawingArea 响应键盘事件?
【发布时间】:2019-07-07 09:38:14
【问题描述】:

在 GTK3 中,如何让 DrawingArea 响应键盘事件? 我应该将 DrawingArea 与信号连接还是更复杂? 我正在使用带有 C 语言的 GTK3。

【问题讨论】:

    标签: c gtk3 keyboard-events drawingarea


    【解决方案1】:

    我终于找到了解决方案here。我只连接了信号,但是绘图区域也需要设置GTK_CAN_FOCUS。

    【讨论】:

      【解决方案2】:

      首先,您需要在事件掩码中启用按键(可能还有按键释放):

      gtk_widget_add_events(my_drawing_area, 
                            GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
      

      然后你可以连接到信号:

      g_signal_connect(my_drawing_area,"key-press-event", 
                       my_key_press,my_user_data);
      g_signal_connect(my_drawing_area,"key-release-event",
                       my_key_release,my_user_data);
      

      并像这样定义一些回调函数:

      gboolean my_key_press(GtkWidget *widget,
                            GdkEventKey *event,
                            gpointer user_data)
      {
          return FALSE;
      }
      
      gboolean my_key_release(GtkWidget *widget,
                              GdkEventKey *event,
                              gpointer user_data)
      {
          return FALSE;
      }
      

      有关详细信息,请参阅 GtkWidgetGObject SignalsGdkEvent 的文档。

      【讨论】:

      • 这行不通:g_signal_connect(drawing_area, "button-press-event", G_CALLBACK(button_press_event_callback), data); g_signal_connect(drawing_area, "key-press-event", G_CALLBACK(key_press_event_callback), data); g_signal_connect(drawing_area, "key-release-event", G_CALLBACK(key_press_event_callback), data); gtk_widget_add_events(drawing_area, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK);
      • 我认为不工作意味着回调永远不会被调用。我不确定这是否重要,但您可能需要在连接信号之前致电gtk_widget_add_events()。否则可能是焦点问题,按键被发送到另一个小部件。如果您不关心小部件焦点并且只想捕获所有按键,那么使用(顶层)窗口而不是绘图区域可能是一个更好的主意。
      • 我更改了顺序,但仍然没有调用回调。在原始代码中,按钮按下事件有效,所以我认为顺序无关紧要。当我测试它时,我单击了小部件的乘法次数以确保焦点位于绘图区域上。我只想在焦点位于绘图区域时捕捉按键。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多