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

时间:2012-05-24 15:23:44

标签: haskell gtk glade gtktreeview

这就是我目前如何从glade文件初始化Tree视图(删除不感兴趣的部分)

tree_view <- xmlGetWidget xml castToTreeView "tree_view"

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

text <- get text_field entryText
是的,有人能帮帮我吗?

由于

3 个答案:

答案 0 :(得分:8)

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

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

    store <- listStoreNew String
    

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

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

    column <- treeViewColumnNew
    
  • 树视图列必须知道要显示的数据以及如何显示它(作为文本,作为复选框,作为图片......)所以我们需要一个单元格渲染器。单元格渲染器将从树模型中的每一行获取一段数据,并在给定列中显示它。要显示文本,需要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 ]
    

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

    -- Insert the column into the tree view
    _ <- treeViewAppendColumn tree_view column
    -- Optional: Give a header/title to the column
    treeViewColumnSetTitle column "My data"

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

    treeViewSetModel tree_view store

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

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

答案 1 :(得分:1)

TreeView

  

“显示实现TreeModel的任何对象的窗口小部件   接口“。

所以你需要treeViewGetModel,treeViewSetModel来获取TreeModel。

我希望您需要的TreeModel接口是TreeStore:

  

提供了两个实现TreeModel的通用模型   interface:TreeStore和ListStore。要使用这些,   开发人员只需根据需要将数据插入这些模型中。

TreeStore有treeStoreInsert

答案 2 :(得分:0)

如果你初始化你的树存储(只是传递一个空列表),Haskell将不知道它的确切类型,并会说存储的类型是“TreeStore(GHC.Prim.Any *)”,不是你想要的。

TreeStores比ListStores更复杂,因为它们不仅必须包含数据,还必须包含其层次结构(父节点和子节点)。

参见treeStoreNew的定义:

    treeStoreNew :: Forest a -> IO (TreeStore a)

TreeStores拥有“a”类型的“森林”(整数,字符串等)。 Forest类型在Data.Tree模块中定义,因此您必须导入此模​​块:

    import Data.Tree

Forest只是“树a”的列表,这意味着数据类型“Tree”保存类型为“a”的值。 也就是说,为了正确设置树存储,如果要存储字符串,则必须执行以下操作:

    let id :: [Tree String]
        id = []
    store <- treeStoreNew id

如果您查看商店的类型(在GHCi提示符下),您会看到它是正确的:

    :t store
    store :: TreeStore String

要在“[]”(顶层,没有父级)处插入行,如果顶层已经存在一些行(即(-1)的含义),则将其追加到末尾,例如字符串“John”:

    treeStoreInsert store [] (-1) "John"

该行将插入路径[0]。在GHCi上查看:

    treeStoreGetTree store [0] >>= print

这将给出“Node {rootLabel =”John“,subForest = []}”。

要插入“John”的孩子,例如“Smith”:

    treeStoreInsert store [0] (-1) "Smith"

树现在将包含父项和子项(使用GHCi检查):

    treeStoreGetTree store [0] >>= print

现在输出“Node {rootLabel =”John“,subForest = [Node {rootLabel =”Smith“,subForest = []}]}”。

最后,

    treeStoreGetTree store [0,0] >>= print

仅显示孩子:节点{rootLabel =“Smith”,subForest = []}

请参阅文档以了解有关该主题的更多信息。