如何使用gtk.go.Connect()设置一个带参数的槽(事件处理程序)?

时间:2014-04-09 11:04:35

标签: event-handling go gtk go-gtk

我正在使用GTK bindings for Go

尝试将gtk.RadioButton toggle信号连接到某个功能。这段代码工作正常:

...

radioButton.Connect("toggled", doRadioToggle)

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

...

切换radioButton时,会调用doRadioToggle - Good。


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

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

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

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

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

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

传递给connect() - radioButton的第三个参数 - 对应于<{p>}中的datas

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

文档不清楚如何直接传递其他数据;也许只是简单地使用一个闭包。

https://godoc.org/github.com/mattn/go-gtk/glib#CallbackContext

答案 1 :(得分:0)

根据GitHub上惊人的mattn的回复:

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)

...

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