如何解决如何将事件监听器与GtkAda Builder连接起来?
在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或我发现的任何地方都没有解决此问题的示例,我不知道该怎么做。这只是一个玩具课吗?
解决方法
如果要从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;
编辑:第一段,更好地说明了问题代码示例为何不起作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。