我有TreeView
的句柄恰好有ListStore
作为其模型。我想要做的是从我的句柄到ListStore
取回TreeView
的句柄。
正如here所指出的那样,treeViewGetModel
getter返回通用TreeModel
而不是TreeModelClass
的实例,例如,特别是ListStore
。我不知道从TreeModel
到ListStore
的任何演员函数......
我也不想做this(也就是说,当我定义模型并将其传递到我想要使用的地方时,只需保留模型的句柄)。
有人知道这个问题有一个很好的解决方案吗?
答案 0 :(得分:1)
问题源于树视图可能具有不同的模型。函数TreeView a -> ListStore a
将是部分的(未针对具有不同模型的树视图定义),因此使用起来不安全。
gtk2hs's trac和Stack 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没有的内部函数/模块(如果这是用于闭源项目或供内部使用),虽然这会产生额外的维护费用。