如何让小部件承认它们真正能够处理的事件 我和Go和Fye在一起,这是对C++和Python和其他OO语言的新习惯。我试图将一些不同种类的Fyne小部件与某些常见行为结合起来,但我迷路了。例如,我需要在许多小部件上创建变体,比如标签和按钮,以允许我捕获右键单击(点击二次),这样我就可以做一些特殊的事情(通常,弹出菜单)。是的,我想要按钮和标签之类的弹出菜单;我甚至想在输入框中截取它(尽管我必须以这种方式实现粘贴)

如何让小部件承认它们真正能够处理的事件 我和Go和Fye在一起,这是对C++和Python和其他OO语言的新习惯。我试图将一些不同种类的Fyne小部件与某些常见行为结合起来,但我迷路了。例如,我需要在许多小部件上创建变体,比如标签和按钮,以允许我捕获右键单击(点击二次),这样我就可以做一些特殊的事情(通常,弹出菜单)。是的,我想要按钮和标签之类的弹出菜单;我甚至想在输入框中截取它(尽管我必须以这种方式实现粘贴),go,widget,fyne,Go,Widget,Fyne,我在网上找到了一个例子,它提供了这一点,让我能够拦截标签上的点击: 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 New

我在网上找到了一个例子,它提供了这一点,让我能够拦截标签上的点击:

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传递函数,当我单击标签时会调用它们

问题是,如果我没有在网上找到代码示例,我永远不会知道或者能够计算出标签允许您定义TappedSecondary,并在组合结构中点击,并以这种方式捕获内容。我需要在各种小部件上捕捉这些事件和其他事件,如符文和键。在哪里可以找到小部件悄悄支持但在中没有提到的函数名?我知道这与接口有关,因为代码示例提到,如果不同时为Tapped和TappedSecondary创建定义(即使您只需要一个定义),那么就不会有任何效果。某个地方的某个东西能够询问每个小部件支持哪些接口并相应地执行操作,但是机制定义在哪里

(GO让我错过C++,在这里你定义一个小部件类,并给它提供虚拟钩子,用于所有可能的鼠标、键等事件,然后你可以根据需要重写并做一些事情,从定义上看,这一切都是可见的。这看起来更模糊了。) 编辑:因此,如果我读对了答案,Go可以通过某种方式查询接收输入的小部件是否实现了各种接口。在某个地方,一定有相当于

/* pseudocode for handling a right click */
if (thisWidget is Tappable) { 
   ((Tappable)thisWidget).SecondaryTap(pe)
}

它是怎么做到的?像“is”这样的动词在Python中是有意义的,C++的等价物是dynamic_cast和对nullptr的检查,但是Go如何提供这一点呢?我希望一旦我知道了语法,我就可以搜索go代码库,找到哪些小部件处理哪些接口。

标签本身不支持点击-您正在添加的代码中添加该功能。任何实现Tappable()的小部件都会触发tap事件。通过实现类似的接口,小部件可以自由处理Fyne理解的任何事件


这不是标签的“隐藏功能”,但肯定可以更好地记录它。在快速查看(软件包文档)之后,可能应该将其添加到

,我认为这里的主要问题是文档不够充分。在编写Go代码时,您将习惯接口类型背后的概念,不会错过很多虚拟函数,甚至根本不会错过,但这肯定需要时间。不过,用任何语言编写晦涩难懂的代码都是可能的。这里有一个有用的技巧:跳到页面底部,在那里可以看到
目录
,然后单击每个目录。使文档不充分的原因是您几乎必须阅读所有文档。希望不会太多。例如,在本例中,单击
widget
并打开widget页面,您将在其中找到描述
widget.Label
类型的页面。但是没有任何线索表明标签本身可以被点击,或者不可以被点击;Tappable只是一个接口()。如果(某些)Label ish
struct
类型实际上是可Tappable的,那是因为这些结构类型实现了
Tappable
接口,所以这就是您在这里要做的。但是,在我的简短观察中,我没有发现文档中是否有某些部分说“当用户点击按钮时,系统将通过算法a搜索实现可点击界面的东西”。要么需要文档,要么你必须读取处理按钮点击的代码,以发现情况是这样的。文档中调用哪些算法运行在哪些事件上(按钮点击、鼠标移动等)是非常必要的,如果这也是C++库,那么在C++中会有一个类控件。通过一系列函数来处理作为虚拟输入提供的输入。像Label这样的子类可以非常明显地覆盖虚拟函数。您可以简单地将Label子类化,查看要覆盖的内容,等等。。您甚至不需要文档来查看需要做什么。Go是一种非常不同的语言,也是一种有趣的语言,但没有明确的“implements”关键字来显示存在什么样的连接,这是一个学习曲线的噩梦。令人毛骨悚然的是,仅仅在界面上添加一个新函数,就会在运行时神秘地破坏现有代码……几乎可以接受这一点作为答案,但我编辑了这个问题以获得更多的理解。谢谢它的机制是一个Go类型测试,即:“如果tapObj,ok:=obj。(*fyne.Tappable);ok{…}”