【发布时间】: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+ 专家,但我猜一个对点击有反应,另一个对鼠标按钮按下做出反应——这可能是也可能不是点击,因为我们的鼠标上有很多按钮.因此,在后一种情况下,偶数处理程序接受一个参数,指定按下了哪个按钮,等等。