如何在GtkTreeview中填充新条目(使用Haskell和Glade)

use*_*426 3 gtk haskell glade gtktreeview

这就是我当前从glade文件初始化Tree视图的方法(删除了不感兴趣的部分)

tree_view <- xmlGetWidget xml castToTreeView "tree_view"
Run Code Online (Sandbox Code Playgroud)

为了方便起见,我如何使用已填充文本字段中的文本向tree_view添加新条目?

text <- get text_field entryText
Run Code Online (Sandbox Code Playgroud)

愿有人帮帮我吗?

谢谢

小智 8

根据您的描述,我假设您有树视图,但没有正确设置.如果您没有将GTK树视图连接到其他几个小部件,那么它就毫无价值.

  • 树模型,用于保存要在树视图中显示的数据.树模型可以是列表存储,它将数据存储为列表,也可以是树存储,它将数据存储为树,节点包含子节点.在您的情况下,您可能需要创建一个ListStore:

    store <- listStoreNew String
    
    Run Code Online (Sandbox Code Playgroud)

    树模型可以存储任何类型的数据,包括复杂的自定义数据类型.

  • 要显示的每条数据的树视图列.在这种情况下,我们只需要一列,因为我们想要每行显示一个字符串:

    column <- treeViewColumnNew
    
    Run Code Online (Sandbox Code Playgroud)
  • 树视图列必须知道要显示的数据以及如何显示它(作为文本,作为复选框,作为图片......)所以我们需要一个单元格渲染器.单元格渲染器将从树模型中的每一行获取一段数据,并在给定列中显示它.要显示文本,需要CellRendererText.还有其他类型的单元格渲染器用于以其他形式显示数据(例如,CellRendererToggle用于True/False值).

    -- Create a cell renderer for displaying text
    cell <- cellRendererTextNew
    -- Add the cell renderer to the column. A column may display one or more
    -- pieces of data; just pack the cell renderers into the column
    cellLayoutPackStart column cell True
    -- Let the cell renderer know where it has to get the data from
    -- (in this case, the only element of each row). Note that we
    -- want to display some text
    cellLayoutSetAttributes column cell store $ \row -> [ cellText := row ]
    
    Run Code Online (Sandbox Code Playgroud)

接下来,将列插入树视图中.如果您不这样做,该列将不会显示!

    -- Insert the column into the tree view
    _ <- treeViewAppendColumn tree_view column
    -- Optional: Give a header/title to the column
    treeViewColumnSetTitle column "My data"
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要:将树视图连接到树模型:

    treeViewSetModel tree_view store
Run Code Online (Sandbox Code Playgroud)

现在,您应该在树视图中看到一个空列.请参阅http://hackage.haskell.org/package/gtk上的gtk包文档,了解如何在树模型中插入,删除和获取数据(listStoreAppend,listStoreRemove,listStoreGetValue等)

请注意,每个树模型都有一个类型,并且只能处理该类型的数据(但您可以使用任何数据类型,甚至是您自己的数据类型,因此如果正确设置每个树视图列,您确实可以存储和显示复杂数据行).否则,编译程序时会出现类型错误.