我在Go和Fyne方面苦苦挣扎,因为这两者都是新手,并且也习惯于C ++,Python和其他OO语言。我试图使某些不同的Fyne小部件具有某些常见行为,但我迷失了方向。例如,我需要在许多小部件(例如Label和Button)上创建变体,以允许我捕捉右键单击(TapSecondary),以便可以执行一些特殊操作(通常弹出菜单)。是的,我想要诸如“按钮”和“标签”之类的弹出菜单;我什至要在“输入”框中截取它(即使我必须以这种方式实现“粘贴自己”。)
我在网上找到了一个示例,提供了这个示例,可以拦截标签上的点击:
type TapLabel struct {
*widget.Label //composition
//function pointers to set to get events
OnTapped func() //`json:"-"`
OnTappedSecondary func() //`json:"-"` (what are these for anyway?)
}
func NewTapLabelWithStyle(text string, alignment fyne.TextAlign, style fyne.TextStyle,
tappedLeft func(), tappedRight func()) *TapLabel {
return &TapLabel{
widget.NewLabelWithStyle(text, alignment, style),
tappedLeft, tappedRight,
}
}
//somehow this catches right click. How?
func (mc *TapLabel) TappedSecondary(pe *fyne.PointEvent) {
if mc.OnTappedSecondary != nil {
mc.OnTappedSecondary()
}
}
func (mc *TapLabel) Tapped(pe *fyne.PointEvent) {
if mc.OnTapped != nil {
mc.OnTapped()
}
}
所以,它有效。我可以调用NewTapLabelWithStyle并将其函数传递给tappedLeft和tappedRight,当我单击Label时它们会被调用。
问题是,如果我没有在线找到该示例代码,我将永远不会知道或无法得出Label允许您定义一个TappedSecondary和Tapped组合结构并以此方式捕获东西的信息。我将需要在各种小部件上捕获这些事件和其他事件,例如符文和键。在哪里可以找到小部件悄悄支持的功能名称,而在https://godoc.org/中没有提及?我知道这与接口有关,因为代码示例提到即使您不只为Tapped和TappedSecondary创建定义,也不会起作用。某个地方有能力询问每个小部件支持哪些接口并采取相应的措施,但是在哪里定义了该机制?
(Go让我想念C ++,您需要在其中定义Widget类并为所有可能的鼠标,键等事件提供虚拟钩子,然后您可以根据需要进行覆盖并做所有事情,按照定义,可见。这似乎更加晦涩。)
编辑:因此,如果我没看错,Go可以通过某种方式查询接收输入的小部件是否实现了各种接口。在某个地方,必须有等价于
/* pseudocode for handling a right click */
if (thisWidget is Tappable) {
((Tappable)thisWidget).SecondaryTap(pe)
}
它是如何做到的?像“ is”这样的动词在Python中很有意义,而C ++的等效词是dynamic_cast并检查nullptr,但是Go如何提供它呢?我希望一旦知道语法,便可以搜索go代码库并查找哪些小部件处理哪些接口。
答案 0 :(得分:4)
标签本身不支持点击-您正在将该功能添加到添加的代码中。任何实现Tappable(https://godoc.org/fyne.io/fyne#Tappable)的小部件都将在点击事件上触发。小部件可通过实现类似的接口自由处理Fyne理解的任何事件。
这不是Label的“隐藏功能”,但肯定可以更好地记录下来。可能应该将其添加到https://tour.fyne.io/