【发布时间】:2016-02-02 07:30:03
【问题描述】:
我无法让 gtk 的单元格渲染器组合框显示任何选项。我需要为树中的每一行使用不同的模型,cellComboTextModel 应该可以做到这一点。我的结果是组合框渲染器完全为空。
这是一个简化的例子:
{-# OPTIONS_GHC -Wall #-}
module Main ( main ) where
import Graphics.UI.Gtk ( AttrOp( (:=) ) )
import qualified Graphics.UI.Gtk as Gtk
import System.Glib.Signals ( on )
-- the element in the list store
data ListElement =
ListElement
{ leName :: String
, leListStore :: Gtk.ListStore String
}
makeMyTreeview :: IO Gtk.TreeView
makeMyTreeview = do
-- make a list store with two elements
-- the storage for each combo box cell renderer
comboListStore0 <- Gtk.listStoreNew ["hi", "there"]
comboListStore1 <- Gtk.listStoreNew ["A", "B", "C"]
let elements =
[ ListElement "joe" comboListStore0
, ListElement "bob" comboListStore1
]
listStore <- Gtk.listStoreNew elements :: IO (Gtk.ListStore ListElement)
treeview <- Gtk.treeViewNewWithModel listStore :: IO Gtk.TreeView
Gtk.treeViewSetHeadersVisible treeview True
-- add some columns
nameCol <- Gtk.treeViewColumnNew
comboCol <- Gtk.treeViewColumnNew
Gtk.treeViewColumnSetTitle nameCol "name"
Gtk.treeViewColumnSetTitle comboCol "combo"
-- add cell renderers
nameRenderer <- Gtk.cellRendererTextNew
comboRenderer <- Gtk.cellRendererComboNew
Gtk.cellLayoutPackStart nameCol nameRenderer True
Gtk.cellLayoutPackStart comboCol comboRenderer True
_ <- Gtk.treeViewAppendColumn treeview nameCol
_ <- Gtk.treeViewAppendColumn treeview comboCol
-- this sets the name column strings
Gtk.cellLayoutSetAttributes nameCol nameRenderer listStore $
\x -> [Gtk.cellText := leName x ++ "!"]
-- combo box
Gtk.cellLayoutSetAttributes comboCol comboRenderer listStore $ \x ->
[ Gtk.cellComboTextModel := ( leListStore x, Gtk.makeColumnIdString 0 :: Gtk.ColumnId String String
)
, Gtk.cellMode := Gtk.CellRendererModeActivatable
, Gtk.cellComboHasEntry := True
]
-- an action when the combo box is edited
_ <- on comboRenderer Gtk.edited $ \_treePath newVal -> do
putStrLn "combo box is being edited (this never happens)"
putStrLn $ "new value: " ++ newVal
return treeview
main :: IO ()
main = do
_ <- Gtk.initGUI
win <- Gtk.windowNew
_ <- Gtk.set win [ Gtk.containerBorderWidth := 8
, Gtk.windowTitle := "help"
]
treeview <- makeMyTreeview
_ <- Gtk.set win [ Gtk.containerChild := treeview ]
Gtk.widgetShowAll win
Gtk.mainGUI
任何见解将不胜感激。
编辑: 我发现我错过了什么:
Gtk.treeModelSetColumn comboListStore0 (Gtk.makeColumnIdString 0) id
Gtk.treeModelSetColumn comboListStore1 (Gtk.makeColumnIdString 0) id
这将设置 ListStore 列 ID,以便后面的行
Gtk.cellComboTextModel := (leListStore x, Gtk.makeColumnIdString 0 :: Gtk.ColumnId String String)
正确引用了文本。然而,这似乎在 GTK3 中不起作用
【问题讨论】: