Обработка «нажатого» ускорителя на Gtk :: ToggleToolButton (gtkmm)

0

Я пытаюсь подключить ускоритель к 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, что приводит к ожидаемому поведению переключения кнопки?

Теги:
gtk
gtkmm

2 ответа

2
Лучший ответ

Тайна решена!

Благодаря @conscioususer на Twitter: https://twitter.com/conscioususer/statuses/396397287288889344

Оказывается, что Gtk :: ToggleToolButton на самом деле является ToolButton с дочерним ToggleButton. Способ заставить его работать - подключить акселератор к дочернему виджету (например, toggletoolbutton->get_child()->add_accelerator("clicked",...)), а затем все работает так, как ожидалось!

2

Это работает и срабатывает независимо от того, какой обработчик подключен к 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;
}
  • 0
    Возможно ли, что ToggleToolButton не ведет себя так же, как ToggleButton? В моем почти идентичном коде я подключился к «нажал» и «переключил» и зарегистрировал вывод. «Нажатый» ускоритель никогда не вызывает переключение :(
  • 0
    Если вы не подключитесь к «нажал» (только к «переключен»), что произойдет?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню