You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:06:05