0

TreeViewたまたま aListStoreをモデルとして持っている a へのハンドルがあります。私がやりたいことはListStore、私のハンドルから へのハンドルを戻すことTreeViewです。

hereで指摘されているように、ゲッターは、特にここでは a などのインスタンスではなくtreeViewGetModelジェネリックを返します。どちらからのキャスト関数も認識していません...TreeModelTreeModelClassListStoreTreeModelListStore

私もこれをしたくありませ(つまり、モデルを定義するときにモデルへのハンドルを保持し、それを使用したい場所に渡します)。

その問題の良い解決策を知っている人はいますか?

4

1 に答える 1

1

この問題は、ツリー ビューのモデルが異なる可能性があることに起因しています。関数TreeView a -> ListStore aは部分的 (異なるモデルのツリービューに対して定義されていない) であるため、安全に使用できません。

この問題は、gtk2hs の tracおよびStack Overflowで何度も提起されています。提案された解決策は、あなたが言及し、避けたいものと常に似ています。

完全にはわかりませんが、次の行に沿った何かが安全でないキャストを実装すると思います:

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

glib ライブラリの関数を使用してGObject、モデルが実際に aListStoreであるかどうかを判断し、キャストを安全にすることができます。再チューニングMaybe (ListStore a)

特に、 を参照することをお勧めしisA :: GObjectClass o => o -> GType -> Boolます。悲しいことに、他の関数がfor a をgtk_list_store_get_type提供できない場合は、FFI を介してC 関数を使用する必要があるかもしれません。GTypeListStore

あるいは、gtk2hs の独自のフォークをコンパイルしてバインドできる場合は、gtk がエクスポートするが gtk2hs がそうしない内部関数/モジュールを再エクスポートするだけでよいかもしれません (これがクローズド ソース プロジェクトまたは内部使用のためである場合)。 )、ただし、追加のメンテナンス コストが発生します。

于 2016-04-24T17:58:00.987 に答える