为了账号安全,请及时绑定邮箱和手机立即绑定

未能扩展 fyne 的小部件

未能扩展 fyne 的小部件

Go
泛舟湖上清波郎朗 2022-05-05 15:54:36
我正在尝试(非常努力地)扩展 Fyne 的一些小部件的功能。基本上我需要实现或“覆盖”右键单击选择、按钮、编辑等内容。我还需要对其他一些行为进行细微更改。我尝试以各种方式扩展现有的小部件。我所做的一切都会导致编译失败、恐慌或奇怪和不正确的行为。下面的答案提供了 Button 解决方案的声明,但它并不完整。当我将相同的技术应用于 Select 时,尝试左键单击时会出现恐慌。恐慌是panic: interface conversion: fyne.Canvas is nil, not *glfw.glCanvas回想起来,这是我最初失败的地方,也是促使我尝试越来越复杂的方法的原因,但都没有奏效。Button 和 Select 显然有不同的要求。(很抱歉“不接受”,但另一种选择是数小时的尝试,并且不相信我所尝试的 - 即使它避免了恐慌 - 是正确的长期解决方案。声称 Fyne 小部件是可扩展的 - 似乎合理地要求改进文档以显示如何,因为幼稚的尝试并不统一。)在这里,我尝试使用答案中的技术扩展我关心的小部件。我原以为所有这些小部件都会以相同的方式运行,以覆盖 TappedSecondary 为模。他们一般不会。正确的答案显然比下面的答案复杂得多。这是我根据下面给出的代码的发现:扩展按钮(如答案所示):当鼠标进入该区域时,widget.Button会改变颜色。扩展版没有。单击时,这两种形式都不会改变按钮的外观(我通常希望任何 GUI 都会出现这种情况,也许还缺少其他东西?)扩展版本确实捕获了 TappedSecondary。扩展选择(如上所示):左键单击恐慌。右键单击被正确捕获。扩展标签:您必须添加一个无操作的 Tapped 功能以使其与所需的界面相匹配,但是可以捕获右键单击,一切看起来都很好。扩展条目:它捕获了 TappedSecondary,正如预期的那样,这意味着我没有得到通常的下拉菜单。左键单击(移动光标)不会在新位置重绘光标,但内部光标位置会发生变化(退格会删除新位置的字符,然后正确重绘所有内容)。扩展检查: TappedSecondary 被捕获。左键单击会导致调用 OnChanged(并且每次正确传递的布尔值都会交替)但从未绘制复选标记。据我今天所知,这些是我需要扩展的唯一小部件,所以当它使列出的小部件像往常一样工作时,我认为答案是完整的,除了我得到 TappedSecondary。理想的答案是指向在线某个地方的新文档,该文档以保留现有行为的方式为所有小部件类型提供了完整的示例(除非您故意覆盖该行为。)总体印象:以最简单的方式扩展小部件可能会改变或破坏小部件在响应鼠标事件时绘制的某些方面,包括来自 Select 的恐慌和缺少 Entry、Button 和 Check 中的图形更改。我没有覆盖任何现有的 Tapped() 函数,所以我不知道为什么会这样。
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

从库中复制代码在这里会分散注意力 - 扩展小部件是完全可能的,所以我将回答最初的意图而不是修复错误......


您可以通过将核心小部件嵌入到结构中然后添加或覆盖功能来扩展它。关键是调用ExtendBaseWidget,以便内部正确注册您的覆盖类型。以下代码显示了如何创建一个响应右键单击的新按钮。


package main


import (

    "log"


    "fyne.io/fyne"

    "fyne.io/fyne/app"

    "fyne.io/fyne/widget"

)


type myButton struct {

    widget.Button

}


func (m *myButton) TappedSecondary(*fyne.PointEvent) {

    log.Println("Right Click")

}


func newMyButton(label string, tapped func()) *myButton {

    ret := &myButton{}

    ret.ExtendBaseWidget(ret)

    ret.Text = label

    ret.OnTapped = tapped


    return ret

}


func main() {

    a := app.New()


    w := a.NewWindow("Hello")

    w.SetContent(widget.NewVBox(

        newMyButton("Right tap me", func() {

            log.Println("Normal callback")

        }),

    ))


    w.ShowAndRun()

}



查看完整回答
反对 回复 2022-05-05
  • 1 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号