gpt4 book ai didi

event-handling - 如何使用 gtk.go.Connect() 设置接受参数的插槽(事件处理程序)?

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:16 26 4
gpt4 key购买 nike

我正在使用 GTK bindings for Go .

尝试将 gtk.RadioButton toggle 信号连接到函数。此代码工作正常:

...

radioButton.Connect("toggled", doRadioToggle)

func doRadioToggle() {
fmt.Println("toggled")
}

...

当切换 radioButton 时,调用 doRadioToggle - 很好。


但是我想连接一个带参数的函数,例如:

func doRadioToggle(button *gtk.RadioButton) {
fmt.Println(button.GetState())
}

gtk.go.Connect() 函数具有以下签名:

func (v *Widget) Connect(s string, f interface{}, datas ...interface{})

根据我从 gtkmm 了解到的情况,我尝试了这样的代码(go 绑定(bind)显然大大简化了对 connect() 的调用)

radioButton.Connect("toggled", doRadioToggle, radioButton)

connect()中传入的第三个参数——radioButton——对应datas

gtk.Connect(s string, f interface{}, datas ...interface{})

我理解为要传递给插槽的数据参数。

但是使用这段代码,永远不会调用 doRadioToggle() 处理程序,我立即 panic 地退出:

panic: reflect: Call using *glib.CallbackContext as type *gtk.RadioButton

我的问题:如何设置使用 gtk.go.Connect() 获取参数的插槽(事件处理程序)?

最佳答案

基于惊人的 mattn 的回复在 GitHub 上:

https://github.com/mattn/go-gtk/blob/master/example/demo/demo.go#L58

采用、测试和工作:

import(
...
"github.com/mattn/go-gtk/glib"
)

...

func ButtonHandler(ctx *glib.CallbackContext) {
fmt.Printf("Button Handler: %v\n", ctx.Data().(*gtk.RadioButton).GetState())
}

aRadioButton.Connect("toggled", ButtonHandler, aRadioButton)

...

connect() 中的datas参数必须在处理程序的签名中使用*glib.CallbackContext 传递,然后在处理程序代码中传递,使用类型断言获取实际参数。

关于event-handling - 如何使用 gtk.go.Connect() 设置接受参数的插槽(事件处理程序)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22960592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com