处理Gtk :: ToggleToolButton上的“点击”加速器(gtkmm)

时间:2013-10-29 11:29:27

标签: c++ gtk gtkmm

我正在尝试将加速器连接到Gtk :: ToggleToolButton,不幸的是“切换”信号不是“可激活的”,所以你必须连接到“clicked”而不是这样:

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中添加加速器,从而导致切换按钮的预期行为?

2 个答案:

答案 0 :(得分:2)

  

这可以工作,并触发连接到signal_clicked()的任何处理程序但是,它实际上不会改变按钮的外观,或者触发“切换”信号。

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

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

这是我使用的测试代码:

toggled

答案 1 :(得分:2)

神秘解决了!

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

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