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

时间:2017-10-24 13:53:26

标签: go struct interface gtk gtk3

我有这个汇总代码,用于在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()

}

1 个答案:

答案 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

解冻您的标签