gtk2hs - 从TreeView获取ListStore

时间:2016-01-26 00:04:25

标签: haskell treeview gtk2hs treemodel

我有TreeView的句柄恰好有ListStore作为其模型。我想要做的是从我的句柄到ListStore取回TreeView的句柄。

正如here所指出的那样,treeViewGetModel getter返回通用TreeModel而不是TreeModelClass的实例,例如,特别是ListStore 。我不知道从TreeModelListStore的任何演员函数......

我也想做this(也就是说,当我定义模型并将其传递到我想要使用的地方时,只需保留模型的句柄)。

有人知道这个问题有一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

问题源于树视图可能具有不同的模型。函数TreeView a -> ListStore a将是部分的(未针对具有不同模型的树视图定义),因此使用起来不安全。

gtk2hs's tracStack Overflow已多次提出此问题。提出的解决方案总是类似于您提到的并且希望避免的。

我不完全确定,但我认为以下几行中的某些内容会实现不安全的转换:

unsafeCastToListStore :: TreeView a -> ListStore a
unsafeCastToListStore = 
  unsafeCastGObject . toGObject . treeViewGetModel

您可以在glib库中使用GObject的函数来确定模型是否确实是ListStore并使投射安全,即。重新调整Maybe (ListStore a)

特别是,我建议查看isA :: GObjectClass o => o -> GType -> Bool。遗憾的是,如果没有其他函数可以为gtk_list_store_get_type提供GType,则可能必须通过FFI使用C函数ListStore

或者,如果你可以编译和绑定你自己的gtk2hs的fork,你可能只能重新导出gtk导出但gtk2hs没有的内部函数/模块(如果这是用于闭源项目或供内部使用),虽然这会产生额外的维护费用。