これは、現在、空き地ファイルからツリービューを初期化する方法です(興味のない部分を削除しました)
tree_view <- xmlGetWidget xml castToTreeView "tree_view"
簡単にするために、既に入力されているテキスト フィールドのテキストを使用して、tree_view に新しいエントリを追加するにはどうすればよいでしょうか?
text <- get text_field entryText
誰か助けてくれませんか?
ありがとう
これは、現在、空き地ファイルからツリービューを初期化する方法です(興味のない部分を削除しました)
tree_view <- xmlGetWidget xml castToTreeView "tree_view"
簡単にするために、既に入力されているテキスト フィールドのテキストを使用して、tree_view に新しいエントリを追加するにはどうすればよいでしょうか?
text <- get text_field entryText
誰か助けてくれませんか?
ありがとう
あなたの説明から、あなたはツリー ビューを持っていると思いますが、適切に設定していません。GTK ツリー ビューは、他のいくつかのウィジェットに接続しない場合、何の価値もありません。
ツリー ビューに表示されるデータを保持するツリー モデル。ツリー モデルは、データをリストとして保存するリスト ストアか、データをツリーとして保存し、ノードに子を含むツリー ストアのいずれかです。あなたの場合、おそらく ListStore を作成する必要があります。
store <- listStoreNew String
ツリー モデルは、複雑なカスタム データ型を含む、あらゆる型のデータを格納できます。
表示する各データのツリー ビュー列。この場合、行ごとに 1 つの文字列を表示したいので、必要な列は 1 つだけです。
column <- treeViewColumnNew
ツリー ビュー列は、表示するデータとその表示方法 (テキスト、チェック ボックス、画像など) を認識している必要があります。したがって、セル レンダラーが必要です。セル レンダラーは、ツリー モデルの各行からデータを取得し、指定された列に表示します。テキストを表示するには、CellRendererText が必要です。他の形式でデータを表示するための他のタイプのセル レンダラーがあります (たとえば、True/False 値の CellRendererToggle)。
-- Create a cell renderer for displaying text
cell <- cellRendererTextNew
-- Add the cell renderer to the column. A column may display one or more
-- pieces of data; just pack the cell renderers into the column
cellLayoutPackStart column cell True
-- Let the cell renderer know where it has to get the data from
-- (in this case, the only element of each row). Note that we
-- want to display some text
cellLayoutSetAttributes column cell store $ \row -> [ cellText := row ]
次に、列をツリー ビューに挿入します。これをしないと、列が表示されません!
-- Insert the column into the tree view
_ <- treeViewAppendColumn tree_view column
-- Optional: Give a header/title to the column
treeViewColumnSetTitle column "My data"
最後に、ツリー ビューをツリー モデルに接続します。
treeViewSetModel tree_view store
ツリー ビューに空の列が表示されます。ツリーモデル (listStoreAppend、listStoreRemove、listStoreGetValue など) にデータを挿入、削除、取得する方法については、 http: //hackage.haskell.org/package/gtk にある gtk パッケージのドキュメントを参照してください。
すべてのツリー モデルには型があり、その型のデータのみを操作できることに注意してください (ただし、任意のデータ型を使用でき、独自のデータ型も使用できるため、すべてのツリー ビュー列を正しく設定すれば、実際に複雑なデータの行を格納および表示できます)。 )。そうしないと、プログラムのコンパイル時に型エラーが発生します。
TreeViewは_
「TreeModelインターフェースを実装するオブジェクトを表示するウィジェット。」
したがって、TreeModelを取得するには、treeViewGetModel、treeViewSetModelが必要です。
必要なTreeModelインターフェイスはTreeStoreだと思います。
TreeModelインターフェースを実装する2つの汎用モデル、TreeStoreとListStoreが提供されています。これらを使用するには、開発者は必要に応じてこれらのモデルにデータを挿入するだけです。
TreeStoreにはtreeStoreInsertがあります。
そのようにツリー ストアを初期化すると (空のリストを渡すだけ)、Haskell はその正確な型を認識せず、ストアの型が "TreeStore (GHC.Prim.Any *)" であると言うでしょうが、これはそうではありません。あなたが欲しいもの。
TreeStore は、データだけでなくその階層 (親ノードと子ノード) も含める必要があるため、ListStore よりも複雑です。
treeStoreNew の定義を参照してください。
treeStoreNew :: Forest a -> IO (TreeStore a)
TreeStores は、タイプ「a」(整数、文字列など) の「フォレスト」を保持します。Forest タイプはモジュール Data.Tree で定義されているため、このモジュールをインポートする必要があります。
import Data.Tree
フォレストは、「ツリー a」の単なるリストです。つまり、「a」型の値を保持するデータ型「ツリー」を意味します。とはいえ、ツリー ストアを適切に設定するには、文字列を保存する場合は次の手順を実行する必要があります。
let id :: [Tree String]
id = []
store <- treeStoreNew id
ストアのタイプ (GHCi プロンプトで) を見ると、正しいことがわかります。
:t store
store :: TreeStore String
"[]" (最上位、親なし) に行を挿入するには、最上位に行が既にある場合は末尾に追加します (これが (-1) の意味です)。たとえば、文字列 "ジョン":
treeStoreInsert store [] (-1) "John"
行はパス [0] に挿入されます。GHCi で次のように確認します。
treeStoreGetTree store [0] >>= print
これにより、「Node {rootLabel = "John", subForest = []}」が得られます。
「Smith」など、「John」の子を挿入するには:
treeStoreInsert store [0] (-1) "Smith"
ツリーには親アイテムと子アイテムが含まれます (GHCi で確認してください)。
treeStoreGetTree store [0] >>= print
「Node {rootLabel = "John", subForest = [Node {rootLabel = "Smith", subForest = []}]}」が出力されます。
ついに、
treeStoreGetTree store [0,0] >>= print
子のみを表示します: Node {rootLabel = "Smith", subForest = []}
このトピックの詳細については、ドキュメントを参照してください。