【发布时间】:2019-07-07 09:38:14
【问题描述】:
在 GTK3 中,如何让 DrawingArea 响应键盘事件? 我应该将 DrawingArea 与信号连接还是更复杂? 我正在使用带有 C 语言的 GTK3。
【问题讨论】:
标签: c gtk3 keyboard-events drawingarea
在 GTK3 中,如何让 DrawingArea 响应键盘事件? 我应该将 DrawingArea 与信号连接还是更复杂? 我正在使用带有 C 语言的 GTK3。
【问题讨论】:
标签: c gtk3 keyboard-events drawingarea
我终于找到了解决方案here。我只连接了信号,但是绘图区域也需要设置GTK_CAN_FOCUS。
【讨论】:
首先,您需要在事件掩码中启用按键(可能还有按键释放):
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;
}
有关详细信息,请参阅 GtkWidget、GObject Signals 和 GdkEvent 的文档。
【讨论】:
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()。否则可能是焦点问题,按键被发送到另一个小部件。如果您不关心小部件焦点并且只想捕获所有按键,那么使用(顶层)窗口而不是绘图区域可能是一个更好的主意。