如何将事件侦听器与GtkAda Builder连接?
在GtkAda 20.1下使用GtkAda.Builder时,我不知道如何捕获事件数据如何将事件侦听器与GtkAda Builder连接?,ada,gtkada,Ada,Gtkada,在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;
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_生成器将只访问回调的两个原型,一个过程或一个函数,这两个原型都将生成器作为参数。我如何使用它来检查在按键事件中触发的事件?还是一场抽签活动?在testgtkada或任何我发现的地方都没有处理这个问题的例子,我也不知道如何去做。这只是一个玩具类吗?如果您想从GTKAda(以及GTK)中的键盘事件中获取数据,您必须直接将函数连接到所选的小部件,而不是通过Glade调用(如
主窗口销毁
)。Glade只允许向子程序传递附加数据,但无法获取与事件相关的任何内容(如键盘按下/释放、鼠标移动,甚至调整大小后的小部件的新大小)
例如,如果您想要处理在主窗口
小部件中按下的键,则代码应如下所示:
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;
然后回调显示看起来:
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;
编辑:第一段,更好地澄清问题中的代码示例不起作用的原因。我理解您的答案,但问题是:为什么要使用Glade和GtkBuilder?似乎我根本不应该在Glade中放置任何信号并手动建立所有连接,这完全破坏了使用builder框架的任何优势。@Jlotty-根据我自己的经验:Glade和GtkBuilder在设计UI阶段最有用。以后可能最好的选择是将所有内容转换为普通代码。不幸的是,Glade中的这种可能性限制是GTK中的限制,而不是GtkAda中的限制。老实说,我停止使用GTK的原因之一是:)