如何在 Haskell 的 GI-Gtk 中将 Widget 投射到标签?

How do I cast Widget to Label in Haskell's GI-Gtk?

我有这个示例代码,其中有一个包含 ListBoxRows 的 ListBox,而 ListBoxRows 又包含一个标签。当我单击 ListBox 时,我得到一个 ListBoxRow。到目前为止,一切都很好。当我想与 ListBoxRows 子项交互时,问题就开始了。

我已经使用这个函数来获取标签,它是 ListBoxRow 的子项。 https://hackage.haskell.org/package/gi-gtk-3.0.18/docs/GI-Gtk-Objects-Container.html#g:13

但是,返回的类型是Widget。如何转换对象的类型?函数 widgetGetName 告诉我它是一个标签,但是 Haskell 类型系统坚持它是一个 Widget,所以我不能使用标签特定的函数。

工作代码

  _ <- onListBoxRowSelected listbox2 (\(Just r) -> do
                                         cc <- containerGetChildren r
                                         mlabel <- castTo Label (head cc)
                                         case mlabel of
                                           Nothing -> putStrLn "Not a label!"
                                           Just label -> (labelGetText label) >>= putStrLn . unpack)

感谢丹

试试这个:

cc <- containerGetChildren r
mlabel <- castTo Label (head cc)
case mlabel of
  Nothing -> putStrLn “Not a label!”
  Just label -> labelGetText label >>= putStrLn