问题源于树视图可能具有不同模型的事实。函数TreeView a -> ListStore a
将是部分的(未为具有不同模型的树视图定义),因此使用起来不安全。
在gtk2hs 的 trac和Stack Overflow上,这个问题已经被多次提出。建议的解决方案总是与您提到的并希望避免的类似。
我不完全确定,但我认为以下几行会实现不安全的强制转换:
unsafeCastToListStore :: TreeView a -> ListStore a
unsafeCastToListStore =
unsafeCastGObject . toGObject . treeViewGetModel
您可以使用GObject
glib 库中的函数来确定模型是否确实是 aListStore
并使转换安全,即。重调Maybe (ListStore a)
。
特别是,我建议查看isA :: GObjectClass o => o -> GType -> Bool
. gtk_list_store_get_type
可悲的是,如果没有其他函数可以为您提供 a GType
for a ,您可能必须通过 FFI 使用 C 函数ListStore
。
或者,如果您可以编译和绑定您自己的 gtk2hs 分支,您也许可以重新导出 gtk 导出但 gtk2hs 不能导出的内部函数/模块(如果这是用于闭源项目或内部使用) ),尽管这会产生额外的维护成本。