0

下面是一个使用 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
4

3 回答 3

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
于 2011-03-15T10:06:36.570 回答
0

GTK 文档说没有像标签发出的按钮按下这样的信号。

没错,我会说,你应该为这些事情使用按钮。不过,不可否认,gtk2hs 可以更严格地键入并抓住它。

或者,您可以将链接添加到标签文本,然后覆盖适当的信号。

于 2011-02-26T14:39:25.030 回答
0

使标签可选:

set label0 [labelSelectable := True]
于 2011-02-27T00:17:00.277 回答