Захват кликов в label_widget в экспандере (lablgtk)
В lablgtk у меня есть виджет Expander, к которому я добавил кнопку как часть ее метки, как на этом рисунке:
Тем не менее, я не могу захватить клики на эту кнопку, так как все они, кажется, захвачены самим объектом 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) ;