2017-06-25 1 views
2

ハスケルGi-GTK noobはこちら。そして一般的にGTK noob。haskell-gi GTKシグナルの使用

私はイベントボックスにラップしたイメージを持っています。さて、ユーザーがイベントボックス(mousedown)を押したときを検出したいと思います。一部のグーグルでは、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; 
      .... } 

は私が間違って何をしているのですか?

+1

あなたは 'print ...'をイベントハンドラとして使用していますが、これはどのボタンが押されたかなどの情報を受け付ける関数であると考えられます。ブール値がハンドラが成功したかどうかを示す 'IO Bool'を返します。 – chi

+0

私は[gi-gtk hello worldの例](https://github.com/haskell-gi/gi-gtk-examples/blob/master/hello/World.hs)を見て助けを求めました。 30行目では、onButtonClickedボタン(putStrLn "Hello World")を信号に使用していました。そのコードはエラーなしで実行されます。私のコードとそのコードの違いは何ですか? ghciの両方の関数で ':t'を実行しました。型シグネチャの唯一の違いは、' ButtonClickedCallback'をパラメータとして取り、もう一つは 'WidgetButtonPressEventCallback'を取るこ​​とです。私のprintステートメントをputStrLn関数に変更しても、同じエラーが表示されます。 – hello

+0

私はgtk +エキスパートではありませんが、私たちはマウスに多くのボタンを持っているので、クリックに反応し、マウスのボタンを押すと反応します。その結果、偶数ハンドラは、後者の場合、どのボタンが押されたかなどを指定する引数をとります。 – chi

答えて

4

エラーメッセージには既にタイプ:EventButton -> IO Boolのタイプがあり、print "Hello world"のタイプはIO()です。

あなたはしかし簡単で、1にそれを変換することができます:私たちは今のEventButtonパラメータを無視するのでconst $を使用して

onWidgetButtonPressEvent dragevents (const $ print "Hello world">> return True)

、および使用することによって(後であなたのアカウントにイベントパラメータを取ることを決定することができます) >> return Trueでは、印刷後にTrue(コールバックが成功したことを意味します)を返します。

関連する問題