如何在fyne.io自定义布局中访问扩展Widget的自定义变量?
问题:在Fyne自定义布局中访问扩展Label的自定义属性
为了给Label组件设置百分比宽高,我扩展了widget.Label定义了NewLabel结构体,添加了Wpcnt、Hpcnt两个自定义属性,并编写了构造函数createNewLabel。但在自定义布局的Layout方法中,虽然打印CanvasObject时能看到已设置的属性值,却无法直接通过objs[i].Wpcnt访问这些变量,该如何解决?
相关代码
扩展Label的代码:
import "fyne.io/fyne/v2/widget" type NewLabel struct { widget.Label Wpcnt, Hpcnt float32 } func createNewLabel(text string, w, h float32) *NewLabel { lbl := &NewLabel{} lbl.Hpcnt = h lbl.Wpcnt = w lbl.ExtendBaseWidget(lbl) lbl.Text = text return lbl }
自定义布局函数:
func (lo *contentLayout) Layout(objs []fyne.CanvasObject, size fyne.Size) { for i := range objs { o := objs[i] fmt.Printf("cont_layout\n%#v \n\n", o) } // move and size yet to be done. }
解决方案
这是Go语言接口类型的典型问题:objs中的元素是fyne.CanvasObject接口类型,接口本身没有Wpcnt和Hpcnt字段,你需要通过类型断言将接口转换为具体的*NewLabel类型,才能访问自定义字段。
修改后的Layout函数示例:
import "fmt" import "fyne.io/fyne/v2" func (lo *contentLayout) Layout(objs []fyne.CanvasObject, size fyne.Size) { for _, o := range objs { // 尝试将CanvasObject断言为*NewLabel类型 if lbl, ok := o.(*NewLabel); ok { // 断言成功,现在可以直接访问Wpcnt和Hpcnt fmt.Printf("宽度百分比:%f,高度百分比:%f\n", lbl.Wpcnt, lbl.Hpcnt) // 这里可以根据百分比计算实际尺寸并设置 actualWidth := size.Width * lbl.Wpcnt / 100 actualHeight := size.Height * lbl.Hpcnt / 100 o.Resize(fyne.NewSize(actualWidth, actualHeight)) // 后续可以添加位置设置逻辑 } else { // 处理不是NewLabel类型的CanvasObject fmt.Println("当前元素不是自定义的NewLabel类型") } } }
关键说明
o.(*NewLabel)是类型断言语法,尝试将接口o转换为*NewLabel指针类型- 第二个返回值
ok是布尔值,用来判断断言是否成功,避免类型不匹配时触发panic - 断言成功后,就可以通过
lbl.Wpcnt、lbl.Hpcnt直接访问自定义属性,进而计算元素的实际尺寸
内容的提问来源于stack exchange,提问作者Harshana
相关产品推荐
相关产品推荐

