2

在 GtkAda 20.1 下使用 GtkAda.Builder 时,我不知道如何捕获事件数据。

with Gtk.Widget;                       use Gtk.Widget;
with Gtk.Main;                         use Gtk.Main;
with Gtkada.Builder;                   use Gtkada.Builder;
with Glib.Error;                       use Glib.Error;
with Callbacks;
with Glib;                             use type Glib.Guint;

with Ada.Text_IO;
procedure Main is

   Builder : Gtkada_Builder;
   Error   : aliased GError;
   Err_Num : Glib.Guint;

begin
   Init;

   Gtk_New (Builder);
   Err_Num := Add_From_File (Builder, "data/main_window.glade", Error'Access);

   if Err_Num = 0 then
      Ada.Text_IO.Put_Line ("Error : " & Get_Message (Error));
      Error_Free (Error);
      return;
   end if;

   Register_Handler
     (Builder      => Builder,
      Handler_Name => "on_main_window_destroy",
      Handler      => Callbacks.Main_Window_Destroy'Access);  -- Works fine
   Register_Handler
     (Builder => Builder,
      Handler_Name => "on_key_pressed",
      Handler      => Callbacks.Key_Pressed'Access);   -- but wait

   Show_All (Gtk_Widget(Get_Object (Builder, "main_window")));
   Main;

   Unref (Builder);
end Main;


package Callbacks is
   procedure Main_Window_Destroy
     (Object : access Gtkada_Builder_Record'Class);

   function Key_Pressed
     (Object : access Gtkada_Builder_Record'Class) 
      return Boolean;
      -- how do I get a Gdk.Event.Gdk_Event_Key from this????
end Callbacks;

如示例所示,GtkAda_Builder 将只访问回调的两个原型,一个过程或一个函数,两者都将 Builder 作为参数。如何使用它来检查在 key_press 事件的情况下触发的事件?还是抽奖活动?在 testgtkada 或我发现的任何地方都没有处理这个问题的例子,我不知道该怎么做。这只是一个玩具课吗?

4

1 回答 1

2

如果您想从 GTKAda(以及 GTK 中)的键盘事件中获取数据,您必须将函数直接连接到选定的小部件,而不是通过 Glade 调用(如Main_Window_Destroy)。Glade 只允许将附加数据传递给子程序,但无法获取与事件相关的任何内容(如键盘按下/释放、鼠标移动甚至调整大小后小部件的新大小)。

例如,如果您想处理Main_Window小部件中按下的键,代码应如下所示:

On_Key_Press_Event(Main_Window, My_Key_Pressed'Access);

然后回调显示看起来:

function My_Key_Pressed
 (Self: access Gtk_Widget_Record'Class; Event: Gdk.Event.Gdk_Event_Key)
  return Boolean is
begin
   return True;
end My_Key_Pressed;

编辑:第一段,更好地说明为什么问题中的代码示例不起作用。

于 2020-08-25T07:43:56.493 回答