3

我似乎无法编写使用 gtk 3 绑定gi-gtk(特别是版本 3.0.32)创建和填充 TreeView 的工作代码。我可以在网上找到的所有示例都适用于不适用于gi-gtk. 在这种情况下,文档本身尤其无用。

我试过复制这个例子的简化版(一行一列),如下

import qualified GI.Gtk as Gtk
import Data.GI.Base.GType (gtypeString)
import Data.GI.Base.GValue (IsGValue(..))

main :: IO ()
main = do
  Gtk.init Nothing
  w <- Gtk.windowNew Gtk.WindowTypeToplevel
  treeView <- Gtk.treeViewNew
  store <- Gtk.listStoreNew [gtypeString]
  Gtk.treeViewSetModel treeView (Just store)

  iter <- Gtk.listStoreAppend store
  str <- toGValue (Just "foo")
  Gtk.listStoreSetValue store iter 0 str

  Gtk.treeViewColumnNew >>= Gtk.treeViewAppendColumn treeView

  Gtk.containerAdd w treeView
  #showAll w

  Gtk.main

结果显然是错误的,看起来像一个部分绘制的树视图,没有显示文本。我不知道我做错了什么,所以如果有人能展示如何修复代码或将我指向一个工作示例,我将不胜感激。

4

1 回答 1

0

这是我的工作示例:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Main where

import Data.GI.Base
import Control.Monad 
import Data.Text (Text, pack)
import qualified GI.Gtk as Gtk
import qualified GI.Pango as Pango

demoList::[Text]
demoList = ["1 James","2 John","3 Robert","4 Michael","5 William","6 David","7 Richard","8 Joseph","9 Thomas","10 Charles"]
 
setValuesToListStore :: Gtk.ListStore ->  [Text] -> Int -> IO Gtk.TreeIter
setValuesToListStore lsts artx counter = do
             let stT::Text = artx !! counter
             gv <- toGValue (Just stT)
             if (counter == (length artx)-1) then Gtk.listStoreInsertWithValuesv lsts (-1) [0] [gv]              
             else do               
               m <- (Gtk.listStoreInsertWithValuesv lsts (-1) [0] [gv])
               setValuesToListStore lsts artx (counter + 1)

main :: IO ()
main = do
    void $ Gtk.init Nothing

    window <- new Gtk.Window []
    on window #destroy Gtk.mainQuit

    column <- new Gtk.TreeViewColumn [ #title := "Column name" ]
    render <- new Gtk.CellRendererText [ #ellipsize :=  Pango.EllipsizeModeEnd
                                       , #editable := False ]
    #packStart column render True
    #addAttribute column render "text" 0

    mlistStore <- Gtk.listStoreNew [gtypeString]
   
    setValuesToListStore mlistStore demoList 0 
    
    view <- new Gtk.TreeView[#enableTreeLines := True, #headersVisible := True]     
    lk <- (Gtk.treeViewSetModel view (Just mlistStore))
    
    #appendColumn view column

    #expandAll view
    #add window view
    #showAll window

    Gtk.main
于 2020-07-21T17:57:09.703 回答