ハスケル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;
.... }
は私が間違って何をしているのですか?
あなたは 'print ...'をイベントハンドラとして使用していますが、これはどのボタンが押されたかなどの情報を受け付ける関数であると考えられます。ブール値がハンドラが成功したかどうかを示す 'IO Bool'を返します。 – chi
私は[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
私はgtk +エキスパートではありませんが、私たちはマウスに多くのボタンを持っているので、クリックに反応し、マウスのボタンを押すと反応します。その結果、偶数ハンドラは、後者の場合、どのボタンが押されたかなどを指定する引数をとります。 – chi