0

我有一个句柄TreeView,恰好有一个ListStore作为它的模型。我想要做的是ListStore从我的句柄到TreeView.

正如这里所指出的,treeViewGetModelgetter 返回一个泛型TreeModel而不是一个实例TreeModelClass,特别是在这里,a ListStore。我不知道任何一个TreeModel转换函数ListStore...

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

有人知道解决这个问题的好方法吗?

4

1 回答 1

1

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

在gtk2hs 的 tracStack Overflow上,这个问题已经被多次提出。建议的解决方案总是与您提到的并希望避免的类似。

我不完全确定,但我认为以下几行会实现不安全的强制转换:

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

您可以使用GObjectglib 库中的函数来确定模型是否确实是 aListStore并使转换安全,即。重调Maybe (ListStore a)

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

或者,如果您可以编译和绑定您自己的 gtk2hs 分支,您也许可以重新导出 gtk 导出但 gtk2hs 不能导出的内部函数/模块(如果这是用于闭源项目或内部使用) ),尽管这会产生额外的维护成本。

于 2016-04-24T17:58:00.987 回答