我正在为Go和Fyne而苦苦挣扎,对两者都很陌生,并且太习惯于C++,Python和其他OO语言。我试图将某些常见的行为灌输给许多不同类型的 Fyne 小部件,但我迷路了。例如,我需要在许多小部件上创建变体,例如标签和按钮,以允许我捕获右键单击(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 和 Tappped 并以这种方式捕获内容。我需要在各种小部件上捕获这些事件和其他事件,例如符文和钥匙。我在哪里可以找到小部件悄悄支持但在 https://godoc.org/中没有提及的函数名称?我知道这与接口有关,因为代码示例提到,如果您不为 Tappped 和 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代码库并找到哪些小部件处理哪些接口。
标签本身不支持点击 - 您正在添加的代码中添加该功能。任何实现 Tappable (https://godoc.org/fyne.io/fyne#Tappable( 的小部件都将在点击事件时触发。小部件可以通过实现类似的接口自由地处理Fyne理解的任何事件。
这不是 Label 的"隐藏功能",但它肯定可以更好地记录。它可能应该添加到 https://tour.fyne.io/