【问题标题】:gtk2hs - Getting back a ListStore from a TreeViewgtk2hs - 从 TreeView 取回 ListStore
【发布时间】:2016-01-26 00:04:25
【问题描述】:
我有一个TreeView 的句柄,它恰好有一个ListStore 作为它的模型。我想要做的是从我的TreeView 的句柄中取回ListStore 的句柄。
正如here 所指出的,treeViewGetModel getter 返回一个通用的TreeModel,而不是TreeModelClass 的实例,特别是这里的ListStore。我也不知道从TreeModel 到ListStore 的任何转换函数...
我也不想做this(也就是说,在我定义它时保留模型的句柄并将其传递到我想使用它的地方)。
有人知道解决这个问题的好方法吗?
【问题讨论】:
标签:
haskell
treeview
gtk2hs
treemodel
【解决方案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。可悲的是,如果没有其他函数可以为您提供 GType 以获取 ListStore,您可能必须通过 FFI 使用 C 函数 gtk_list_store_get_type。
或者,如果您可以编译和绑定您自己的 gtk2hs 分支,您也许可以重新导出 gtk 导出但 gtk2hs 不能导出的内部函数/模块(如果这是针对闭源项目或供内部使用),尽管这会产生额外的维护费用。