0

我正在尝试将加速器连接到 Gtk::ToggleToolButton,不幸的是,“切换”信号不是“可激活的”,因此您必须连接到“点击”,如下所示:

togglebutton->add_accelerator("clicked", ...etc..)

这有效,并触发任何连接到 signal_clicked() 的处理程序,但它实际上并没有改变按钮的外观,或触发“切换”信号。基本上触发“点击”不会改变按钮的“活动”状态。

因此,显而易见的解决方案是从“clicked”回调中调用 toolbutton->set_active(true/false)。但是现在的问题是 set_active 本身会触发“clicked”信号和“toggled”信号,因此您最终会陷入无限循环:

accelerator -> clicked handler -> set_active() -> clicked handler -> set_active()

所以,我的问题是,如何向 ToggleToolButton 添加加速器,从而导致切换按钮的预期行为?

4

2 回答 2

2

这有效,并触发连接到 signal_clicked() 的任何处理程序,但它实际上并没有改变按钮的外观,或触发“切换”信号。

我不确定这是否正确。a的默认clicked处理程序ToggleButton似乎会导致toggled信号被触发,并且外观会按照您的预期发生变化。

但是,如果您手动连接到clicked信号,并且不链接到默认处理程序,那么您可以阻止这种情况发生!我花了一点时间来解决这个问题。我确定如何在 gtkmm 中进行链接(我通常使用 C 或 Vala 进行 GTK 工作),但这并不重要,因为您可以让默认处理程序连接到它的东西并连接到toggledlike你想要。

这是我使用的测试代码:

#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;
}
于 2013-10-30T03:45:30.580 回答
2

谜团已揭开!

感谢 Twitter 上的@conscioususer:https ://twitter.com/conscioususer/statuses/396397287288889344

事实证明,Gtk::ToggleToolButton 实际上是一个带有子 ToggleButton 的 ToolButton。使其工作的方法是将加速器连接到子小部件(例如toggletoolbutton->get_child()->add_accelerator("clicked", ...)),然后一切都按预期工作!

于 2013-11-02T07:27:47.067 回答