Frage

Ich kann GTK nicht zwingen, Daten in TreeView mit ListStore -Modell mit mehreren Spalten über Haskell zu rendern. Ich habe den folgenden Code

addTextColumn view name =
    do
    col <- treeViewColumnNew
    rend <- cellRendererTextNew
    treeViewColumnSetTitle col name
    treeViewColumnPackStart col rend True
    treeViewColumnSetExpand col True
    treeViewAppendColumn view col

prepareTreeView view = 
    do
    addTextColumn view "column1"
    addTextColumn view "column2"

    --adding data here

Dann versuche ich, einige Daten hinzuzufügen, und es gibt Probleme. Ich habe diese ausprobiert:

    --variant 1 (data TRow = TRow {one::String, two::String}
    model <- listStoreNew ([] :: [TRow])
    listStoreAppend model $ TRow { one = "Foo", two = "Boo" }
    treeViewSetModel view model

    --variant 2
    model <- listStoreNew ([] :: [[String]])
    listStoreAppend model ["foo","boo"]
    treeViewSetModel view model

    --variant 3
    model <- listStoreNew ([] :: [(String, String)])
    listStoreAppend model ("foo", "boo")
    treeViewSetModel view model

In allen Fällen sehe ich die Tabelle mit Spaltenkopfzeile und einer leeren Zeile eingefügt. Jede Hilfe wird geschätzt.

War es hilfreich?

Lösung

Ich wurde eine wichtige Sache vermisst. Da das ListStore -Modell polymorph ist, müssen Sie beschreiben, wie das Modell Daten aus dem ihm gegebenen Objekte extrahieren soll. Jedes Mal, wenn Sie die neue Spalte hinzufügen, sollten Sie den Code wie diesen schreiben (Beispiel für Text -Renderer):

cellLayoutSetAttributes yourColumn yourRenderer model (\row -> [ cellText := yourPowerfulValueExtractionFunction row ])

wo row sind Ihre Daten.

Dies ist also der Code der Lösung mit Daten, die mit "Variante 1" implementiert sind (siehe Frage):

prepareTreeView view = 
    do
    model <- listStoreNew ([] :: [TRow])

    addTextColumn view model one "one"
    addTextColumn view model two "two"

    listStoreAppend model $ TRow { one = "foo", two = "boo" }

    treeViewSetModel view model

-- 
addTextColumn view model f name =
    do
    col <- treeViewColumnNew
    rend <- cellRendererTextNew
    treeViewColumnSetTitle col name
    treeViewColumnPackStart col rend True
    -- LOOK HERE:
    cellLayoutSetAttributes col rend model (\row -> [ cellText := f row ])

    treeViewColumnSetExpand col True
    treeViewAppendColumn view col
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top