Я пытаюсь подключить ускоритель к Gtk :: ToggleToolButton, к сожалению, сигнал "переключить" не "активируется", и поэтому вы должны подключиться к "clicked" вместо этого так:
togglebutton->add_accelerator("clicked", ...etc..)
Это работает и срабатывает независимо от того, какой обработчик подключен к signal_clicked(), но на самом деле он не меняет внешний вид кнопки или не загорается "переключенный" сигнал. В принципе, стрельба "нажата" не изменяет "активное" состояние кнопки.
Таким образом, очевидным решением является вызов toolbutton-> set_active (true/false) из "обратного" обратного вызова. Но теперь проблема заключается в том, что set_active сам запускает "щелкнутый" сигнал и "переключенный" сигнал, поэтому вы оказываетесь в бесконечном цикле:
accelerator -> clicked handler -> set_active() -> clicked handler -> set_active()
Итак, мой вопрос: как добавить ускоритель в ToggleToolButton, что приводит к ожидаемому поведению переключения кнопки?
Тайна решена!
Благодаря @conscioususer на Twitter: https://twitter.com/conscioususer/statuses/396397287288889344
Оказывается, что Gtk :: ToggleToolButton на самом деле является ToolButton с дочерним ToggleButton. Способ заставить его работать - подключить акселератор к дочернему виджету (например, toggletoolbutton->get_child()->add_accelerator("clicked",...)
), а затем все работает так, как ожидалось!
Это работает и срабатывает независимо от того, какой обработчик подключен к signal_clicked(), но на самом деле он не меняет внешний вид кнопки или не загорается "переключенный" сигнал.
Я не уверен, что это правильно. Обработчик clicked
умолчанию для ToggleButton
видимому, приводит к toggled
сигнала, а внешний вид меняется, как и следовало ожидать.
Но если вы вручную подключаетесь к clicked
сигналу и не привязываетесь к обработчику по умолчанию, то вы прекратите это делать! Мне потребовалось немного времени, чтобы это исправить. Я уверен, как точно выполнить цепочку в gtkmm (обычно я использую C или Vala для работы GTK), но это не имеет особого значения, поскольку вы можете просто позволить обработчику по умолчанию для своей вещи и подключиться к toggled
как вы хотите.
Это тестовый код, который я использовал:
#include <gtkmm.h>
void on_toggle()
{
g_print("Toggled\n");
}
int main(int argc, char **argv)
{
Gtk::Main kit(argc, argv);
Gtk::Window w;
Gtk::ToggleButton t("Click me");
Glib::RefPtr<Gtk::AccelGroup> group = Gtk::AccelGroup::create();
t.add_accelerator("clicked", group, GDK_KEY_N, (Gdk::ModifierType) 0,(Gtk::AccelFlags) 0);
t.signal_toggled().connect(sigc::ptr_fun(&on_toggle));
w.add_accel_group(group);
w.set_default_size(100, 100);
w.add(t);
w.show_all();
kit.run(w);
return 0;
}