3

これは、現在、空き地ファイルからツリービューを初期化する方法です(興味のない部分を削除しました)

tree_view <- xmlGetWidget xml castToTreeView "tree_view"

簡単にするために、既に入力されているテキスト フィールドのテキストを使用して、tree_view に新しいエントリを追加するにはどうすればよいでしょうか?

text <- get text_field entryText

誰か助けてくれませんか?

ありがとう

4

3 に答える 3

8

あなたの説明から、あなたはツリー ビューを持っていると思いますが、適切に設定していません。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 パッケージのドキュメントを参照してください。

すべてのツリー モデルには型があり、その型のデータのみを操作できることに注意してください (ただし、任意のデータ型を使用でき、独自のデータ型も使用できるため、すべてのツリー ビュー列を正しく設定すれば、実際に複雑なデータの行を格納および表示できます)。 )。そうしないと、プログラムのコンパイル時に型エラーが発生します。

于 2012-05-24T22:38:16.197 に答える
1

TreeViewは_

「TreeModelインターフェースを実装するオブジェクトを表示するウィジェット。」

したがって、TreeModelを取得するには、treeViewGetModel、treeViewSetModelが必要です。

必要なTreeModelインターフェイスはTreeStoreだと思います。

TreeModelインターフェースを実装する2つの汎用モデル、TreeStoreとListStoreが提供されています。これらを使用するには、開発者は必要に応じてこれらのモデルにデータを挿入するだけです。

TreeStoreにはtreeStoreInsertがあります。

于 2012-05-24T17:05:39.323 に答える
0

そのようにツリー ストアを初期化すると (空のリストを渡すだけ)、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 = []}

このトピックの詳細については、ドキュメントを参照してください。

于 2012-05-25T22:47:34.977 に答える