如何在gtk2hs中找出类似标签的小部件(或容器?)上的鼠标按钮?

时间:2011-02-26 12:53:55

标签: haskell event-handling gtk gtk2hs

下面是一个使用gtk2hs的简单示例,它添加了一个标签,然后在其上添加了一个点击处理程序。单击标签时,永远不会调用buttonPressEvent处理程序。按钮可以放在一个容器中,但是...容器会触发按钮按下信号吗?

我有一个矩形区域,里面有一些文本(目前正在使用标签),如果用户点击它,我需要知道。我不希望它看起来像一个按钮。

{-# LANGUAGE PackageImports #-}

import Graphics.UI.Gtk
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Gdk.GC
import "mtl" Control.Monad.Trans(liftIO)

main = do
  initGUI
  window <- windowNew
  window `onDestroy` mainQuit

  label0 <- labelNew $ Just "static label"
  widgetAddEvents label0 [ButtonPressMask] -- is this necessary? Still doesn't work with it, though
  label0 `on` buttonPressEvent $ tryEvent $ do
    liftIO $ putStrLn "static label clicked"
  containerAdd window label0

  widgetShowAll window
  mainGUI

3 个答案:

答案 0 :(得分:2)

您想要使用事件框。它是一个捕获事件的容器。

这是一个有效的版本。

{-# LANGUAGE PackageImports #-}

import Graphics.UI.Gtk
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Gdk.GC
import "mtl" Control.Monad.Trans(liftIO)

main = do
  initGUI
  window <- windowNew
  window `onDestroy` mainQuit

  label0 <- labelNew $ Just "static label"

  eventBox0 <- eventBoxNew
  eventBox0 `on` buttonPressEvent $ tryEvent $ do
    liftIO $ putStrLn "static label clicked"

  containerAdd eventBox0 label0
  containerAdd window eventBox0

  widgetShowAll window
  mainGUI

答案 1 :(得分:0)

The GTK docs say没有像标签发出的按钮按下这样的信号。

正确的,我会说,你应该使用按钮来做这些事情。不可否认,gtk2hs可以更严格地输入并抓住它。

或者,您可以添加指向标签文本的链接,然后覆盖相应的信号。

答案 2 :(得分:0)

使标签可选:

set label0 [labelSelectable := True]