在扩展器中捕获label_widget中的点击次数(lablgtk)

时间:2015-09-03 14:05:01

标签: gtk ocaml lablgtk

在lablgtk中,我有一个Expander小部件,我在其中添加了一个按钮作为其标签的一部分,如下图所示:

GTK expander with a custom label_widget containing a button

但是,我无法捕获此按钮的点击次数,因为所有这些按钮似乎都被Expander对象本身捕获。

我甚至尝试在扩展器和按钮之间添加一个事件框(类似于可点击的GLabels的建议),但这没有用。

有没有办法确保按钮收到信号?

以下是一个自包含的示例来说明这一点:点击按钮只打印expander activated!,但从不打button clicked!

let main () =
  (* create expander, a label_widget, and a button *)
  let expander = GBin.expander () in
  let expander_label = GMisc.label ~text:"expander" () in
  let expander_label_widget = GPack.hbox () in
  let button = GButton.button ~stock:`OK () in

  (* add button to label_widget, and label_widget to expander *)
  expander_label_widget#add expander_label#coerce;
  expander_label_widget#add button#coerce;
  expander#set_label_widget expander_label_widget#coerce;

  (* add events for both the button and the expander *)
  ignore (button#connect#clicked
            ~callback:(fun () ->
                Format.printf "button clicked!@."));
  ignore (expander#connect#activate
            ~callback:(fun () ->
                Format.printf "expander activated!@."));

  (* create window and add expander *)
  let window = GWindow.window () in
  window#add expander#coerce;
  ignore (window#connect#destroy
            ~callback:(fun () -> GMain.Main.quit ()));
  (* show result *)
  window#show ();
  GMain.Main.main ()

let () =
  ignore (GtkMain.Main.init ());
  main ()

1 个答案:

答案 0 :(得分:3)

这似乎是GTK +中的Batch Size。 有一个解决方法描述bug,但它在C中。 您必须将以下OCaml代码添加到主函数中。它对我有用。

  
  GMain.Idle.add (fun () ->
    let dummy = GButton.button ~stock:`OK () in
    expander#set_label_widget dummy#coerce ;
    expander#set_label_widget expander_label_widget#coerce ;
    false) ;