Захват кликов в label_widget в экспандере (lablgtk)

В lablgtk у меня есть виджет Expander, к которому я добавил кнопку как часть ее метки, как на этом рисунке:

GTK-экспандер с пользовательским label_widget, содержащим кнопку

Тем не менее, я не могу захватить клики на эту кнопку, так как все они, кажется, захвачены самим объектом 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 ответ

Решение

Это похоже на ошибку в GTK+. Здесь описан обходной путь, но он написан на 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) ;
Другие вопросы по тегам