2016-01-26 55 views
0

我有一個TreeView的句柄,碰巧有一個ListStore作爲它的模型。我想要做的是從我的手柄到TreeView找回ListStore的句柄。gtk2hs - 從TreeView取回ListStore

正如指出的here,該treeViewGetModel吸氣返回通用TreeModel,而不是如TreeModelClass實例,特別是在這裏,一個ListStore。我不知道從TreeModel任何轉換函數來ListStore要麼...

我也做不想做this(即,只是一個手柄保持到模型時,我定義它,並通過它傳遞給我想在哪裏使用它)。

是否有人知道該問題的良好解決方案?

回答

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。不幸的是,如果沒有其他功能可以爲ListStore提供GType,則可能必須通過FFI使用C函數gtk_list_store_get_type。另外,如果你可以編譯並綁定你自己的gtk2hs分支,那麼你可能會重新導出gtk導出的內部函數/模塊,但gtk2hs不會(如果這是一個閉源項目或用於內部使用),儘管這會導致額外的維護成本。