FreeBASIC结合GTK Glade开发时如何响应Glade创建的按钮点击事件
实现方案
核心原理:GTK采用信号回调机制处理交互,你需要给按钮的clicked信号绑定对应的处理函数,用户点击按钮时GTK就会自动执行你编写的逻辑。
具体修改步骤
步骤1:定义点击事件回调函数
在代码开头gtk_init行之后添加回调函数定义,下面的例子实现点击按钮后关闭程序的逻辑:
' Close按钮点击事件回调函数 SUB on_close_button_clicked CDECL (BYVAL button AS GtkButton PTR, BYVAL user_data AS gpointer) EXPORT gtk_main_quit() END SUB
步骤2:绑定信号到按钮
推荐初学者用手动绑定的方式,不需要修改XML结构,不容易出错:
找到代码里gtk_builder_connect_signals(XML, 0)这一行,替换为下面的代码:
' 将按钮的clicked信号和我们写的回调函数绑定 g_signal_connect(Main_CloseButton, "clicked", G_CALLBACK(@on_close_button_clicked), NULL)
完整可运行代码
#INCLUDE ONCE "gtk/gtk.bi" gtk_init(@__FB_ARGC__, @__FB_ARGV__) ' Close按钮点击事件回调函数 SUB on_close_button_clicked CDECL (BYVAL button AS GtkButton PTR, BYVAL user_data AS gpointer) EXPORT gtk_main_quit() END SUB DIM SHARED AS GtkBuilder PTR XML DIM SHARED AS GObject PTR _ mainWindow, Main_CloseButton XML = gtk_builder_new() SCOPE DIM AS GError PTR meld VAR GUISTR = SADD( _ "<?xml version=""1.0"" encoding=""UTF-8""?>" _ "<!-- Generated with glade 3.38.2 -->" _ "<interface>" _ "<requires lib=""gtk+"" version=""3.24""/>" _ "<object class=""GtkWindow"" id=""mainWindow"">" _ "<property name=""can-focus"">False</property>" _ "<child>" _ "<object class=""GtkLayout"">" _ "<property name=""visible"">True</property>" _ "<property name=""can-focus"">False</property>" _ "<child>" _ "<object class=""GtkButton"" id=""Main_CloseButton"">" _ "<property name=""label"" translatable=""yes"">Close</property>" _ "<property name=""width-request"">80</property>" _ "<property name=""height-request"">30</property>" _ "<property name=""visible"">True</property>" _ "<property name=""can-focus"">True</property>" _ "<property name=""receives-default"">True</property>" _ "</object>" _ "<packing>" _ "<property name=""x"">350</property>" _ "<property name=""y"">200</property>" _ "</packing>" _ "</child>" _ "</object>" _ "</child>" _ "</object>" _ "</interface>" _ !"\0") IF 0 = gtk_builder_add_from_string(XML, GUISTR, -1, @meld) THEN WITH *meld ?"Error (GTK-Builder):" ?*.message END WITH g_error_free(meld) END 2 END IF END SCOPE mainWindow = gtk_builder_get_object(XML, "mainWindow") Main_CloseButton = gtk_builder_get_object(XML, "Main_CloseButton") ' 替换原来的gtk_builder_connect_signals行 g_signal_connect(Main_CloseButton, "clicked", G_CALLBACK(@on_close_button_clicked), NULL) g_object_unref(XML) gtk_widget_show_all(GTK_WIDGET(mainWindow)) gtk_main()
扩展说明
- 回调函数必须加
CDECL调用约定和EXPORT修饰,否则GTK信号系统无法识别函数地址 - 绑定信号的第四个参数可以传入自定义数据,会在触发回调时作为
user_data参数传入函数,适合传递控件指针、自定义配置等内容 - 如果需要用GtkBuilder自动绑定信号,只需要在XML的按钮对象定义块中添加
<signal name="clicked" handler="on_close_button_clicked" swapped="no"/>,保留原来的gtk_builder_connect_signals调用即可
内容的提问来源于stack exchange,提问作者Graziano
相关产品推荐
相关产品推荐

