如何让小部件承认它们真正可以处理哪些事件

我对 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 允许您在组合结构中定义 TappedSecondary 和 Taped 并以这种方式捕获内容。我需要在各种小部件上捕获这些事件和其他事件,例如符文和钥匙。在哪里可以找到小部件悄悄支持但在https://godoc.org/中未提及的函数名称?我知道这与接口有关,因为代码示例提到,如果您没有为 Tapped 和 TappedSecondary 创建定义,即使您只想要一个,也不会起作用。某个地方有能力询问每个小部件支持哪些接口并相应地执行操作,但是该机制是在哪里定义的?


(Go 让我怀念 C++,在 C++ 中,您可以定义一个 Widget 类,并为其提供所有可能的鼠标、按键等事件的虚拟钩子,然后您可以根据需要进行重写并执行操作,根据定义,这一切都是可见的。这看起来更加晦涩难懂。)


浮云间
浏览 133回答 1
1回答

MM们

标签本身不支持点击 - 您正在添加的代码中添加该功能。任何实现 Tappable的小部件都将在点击事件时触发。通过实现类似的接口,小部件可以自由地处理 Fyne 理解的任何事件。这不是 Label 的“隐藏功能”,但它肯定可以更好地记录下来。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go