【问题标题】:Using haskell-gi GTK signals使用 haskell-gi GTK 信号
【发布时间】:2017-06-25 00:21:03
【问题描述】:

Haskell Gi-GTK 菜鸟在这里。和一般的 GTK 菜鸟。

我有一张图片,我已将其包装在一个事件框中。现在,我想检测用户何时按下事件框(鼠标按下)。一些谷歌搜索指出我使用button-press-event。我的代码如下。

drag <- imageNewFromFile "rszh.png"
dragevents <- eventBoxNew
containerAdd dragevents drag
set dragevents [widgetHalign := AlignEnd, widgetValign := AlignEnd]
onWidgetButtonPressEvent dragevents (print "Hello world")

而 GHC 无法通过以下神秘的错误消息编译它:

panedraggin.hs:30:42: error:
    • Couldn't match type ‘IO ()’
                     with ‘GI.Gdk.Structs.EventButton.EventButton -> IO Bool’
      Expected type: GI.Gtk.Objects.Widget.WidgetButtonPressEventCallback
        Actual type: IO ()
    • Possible cause: ‘print’ is applied to too many arguments
      In the second argument of ‘onWidgetButtonPressEvent’, namely
        ‘(print "Hello world")’
      In a stmt of a 'do' block:
        onWidgetButtonPressEvent dragevents (print "Hello world")
      In the expression:
        do { Gtk.init Nothing;
             window <- windowNew WindowTypeToplevel;
             onWidgetDestroy window mainQuit;
             windowMaximize window;
             .... }

我做错了什么?

【问题讨论】:

  • 您正在使用print ... 作为事件处理程序,但这应该是一个接受有关按下哪个按钮等信息的函数。 ,并返回一个IO Bool,其中布尔值表示处理程序是否成功。
  • 我查看了gi-gtk hello world example 寻求帮助。在第 30 行,他们使用onButtonClicked button (putStrLn "Hello World") 表示信号。该代码运行没有错误。我的代码和他们的代码有什么区别?我在 ghci 中对这两个函数都运行了:t,它们类型签名的唯一区别是一个以ButtonClickedCallback 作为参数,另一个以WidgetButtonPressEventCallback。将我的 print 语句更改为 putStrLn 函数仍然给我同样的错误。
  • 我不是 gtk+ 专家,但我猜一个对点击有反应,另一个对鼠标按钮按下做出反应——这可能是也可能不是点击,因为我们的鼠标上有很多按钮.因此,在后一种情况下,偶数处理程序接受一个参数,指定按下了哪个按钮,等等。

标签: haskell gtk gtk2hs


【解决方案1】:

嗯,错误消息已经说明了:它需要一个EventButton -&gt; IO Bool 类型的函数,而print "Hello world" 有一个IO () 类型。

但是,您可以通过以下方式轻松将其转换为:

onWidgetButtonPressEvent dragevents (<b>const $</b> print "Hello world"<b> &gt;&gt; return True</b>)

因此,通过使用const $,我们暂时忽略EventButton 参数(稍后您可以决定将事件参数考虑在内),通过使用&gt;&gt; return True,我们确保在打印后,我们返回@987654328 @(表示回调成功)。

【讨论】:

    猜你喜欢
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多