在expander(lablgtk)中的label_小部件中捕获点击

在expander(lablgtk)中的label_小部件中捕获点击,gtk,ocaml,lablgtk,Gtk,Ocaml,Lablgtk,在lablgtk中,我有一个扩展小部件,我在其中添加了一个按钮作为其标签的一部分,如下图所示: 但是,我无法捕获对该按钮的单击,因为它们似乎都是由Expander对象本身捕获的 我甚至尝试在扩展器和按钮之间添加一个事件框(类似于可点击玻璃窗的建议),但这没有帮助 有没有办法确保按钮接收到信号 这里有一个自包含的示例来说明这一点:单击按钮仅打印已激活的扩展器,但从未单击过按钮 let main () = (* create expander, a label_widget, and a bu

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

但是,我无法捕获对该按钮的单击,因为它们似乎都是由Expander对象本身捕获的

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

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

这里有一个自包含的示例来说明这一点:单击按钮仅打印
已激活的扩展器,但从未单击过
按钮

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 ()
这似乎是GTK+中的一个问题。 这里描述了一个变通方法,但它是用C语言编写的。 您必须将以下OCaml代码添加到主函数中。这对我有用

GMain.Idle.add(fun()->
让dummy=GButton.button~stock:`OK()输入
扩展器#设置#标签#小部件虚拟#强制;
扩展器#设置标签#小部件扩展器#标签#小部件#强制;
假);