gotk3,带有自定义小部件的笔记本附加页面并将其取回

标签 go struct interface gtk gtk3

我有这个总结代码来在 Gtk 的笔记本中显示标签。基本上,我创建了一个带有嵌入式标签的自定义结构,并将其添加到笔记本中。之后,我想找回那个自定义小部件,但我得到了一个无效类型断言。我已经阅读了很多关于结构和接口(interface)的内容,但我无法让它发挥作用。

package main

import "github.com/gotk3/gotk3/gtk"

type NotebookPage struct {
    gtk.Label
}


func main() {

    gtk.Init(nil)

    win, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)

    notebook, _ := gtk.NotebookNew()
    win.Add(notebook)

    content1, _ := gtk.LabelNew("Content 1")
    page1 := NotebookPage{Label: *content1}
    label1, _ := gtk.LabelNew("Label 1")
    notebook.AppendPage(&page1, label1)

    content2, _ := gtk.LabelNew("Content 2")
    page2 := NotebookPage{Label: *content2}
    label2, _ := gtk.LabelNew("Label 2")
    notebook.AppendPage(&page2, label2)

    win.ShowAll()
    win.Connect("destroy", func() {
        gtk.MainQuit()
    })

    backwidget1, _ := notebook.GetNthPage(0)
    backpage1, _ := backwidget1.(*NotebookPage)

    gtk.Main()

}

最佳答案

看起来您的问题在第 35 行,如消息所述:

backpage1, _ := backwidget1.(*NotebookPage)

notebook.GetNthPage 返回一个 *Widget,*NotebookPage 不是一个 *Widget,所以你不能转换到它。如果该函数没有返回具体类型(如果它返回相同的 IWidget 接口(interface)),并且如果它没有通过 gtk C 库来回,您可以这样做。

事实上,如果您想取回自定义小部件,您可能需要获取底层的 gtk 小部件或序列化(可能存储您的自定义标签),提取标签并构建一个新的 NotebookPage。

所以你需要这样的东西:

func NewNotebookPage(widget *Widget) {
   return &NotebookPage{Label: widget.GetLabelSomehow()}
}

看起来 Label 也是一个小部件 :) 这很痛苦,因为它试图在 Go 中使用 C++ 继承。您必须了解如何从小部件中解冻标签。C.GtkWidget

关于gotk3,带有自定义小部件的笔记本附加页面并将其取回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46912374/

相关文章:

go - 构造奇怪的行为

java - Powermock:静态接口(interface)方法给出未完成的 stub 异常

string - 函数返回空字符串,即使它不应该在 golang 中

go - 绑定(bind)请求方式POST

go - 使用多个go例程从 channel 中提取

您可以使用指向包含结构的指针来修改嵌套结构的值吗?

go - golang 接口(interface)中是否可以有可选方法?

java - 仅创建接口(interface)实例的目的是什么?

io - 中止来自另一个 goroutine 的 Read() 调用

go - 如何仅使用消息 ID(在 Go 中)确认 Rabbitmq 消息?