我有这个总结代码来在 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/