我有这个汇总代码,用于在Gtk中的笔记本中显示标签。基本上,我已经创建了一个带有嵌入式标签的自定义结构,它被添加到笔记本中。之后,我想回到那个自定义小部件,但我得到了Invalid type assertion
。我已经阅读了很多关于结构和接口的内容,但是我无法让它工作。
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()
}
答案 0 :(得分:1)
如第35行所示,您的问题就在消息中:
backpage1,_:= backwidget1。(* NotebookPage)
notebook.GetNthPage返回一个* Widget,* NotebookPage不是* Widget,所以不允许你强制转换它。如果函数没有返回具体类型(如果它返回相同的IWidget接口),并且它没有通过gtk C库进行往返,则可以执行此操作。
如果您希望恢复自定义窗口小部件,则可能需要获取基础gtk窗口小部件或序列化(可能存储您的自定义标签),提取标签并构建新的NotebookPage。
所以你需要这样的东西:
func NewNotebookPage(widget *Widget) {
return &NotebookPage{Label: widget.GetLabelSomehow()}
}
看起来Label也是一个小部件:)这很痛苦,因为它试图在Go中使用C ++继承。您必须找到如何从widget.C.GtkWidget
解冻您的标签